【问题标题】:How to perform the "in" query on jpa's @ManyToOne JoinColumn without querying the entity如何在不查询实体的情况下对 jpa 的 @ManyToOne JoinColumn 执行“in”查询
【发布时间】:2020-06-23 01:52:33
【问题描述】:

我有一个像这样的实体:

@Entity
class Blog{
    @Id
    private Long id;

    // ...
    @ManyToOne
    @JoinColumn(name = "author_id")
    private User author;
}

我想对author 列执行“in”查询,所以我写了我的BlogRepository 喜欢:

public interface BlogRepository extends JpaRepository<Blog, Long>, CustomizedBlogRepository {

    Page<Blog> findByUserIn(Collection<User> users, Pageable pageable);
}

这可行,但是,我需要为一个请求执行两个查询,即从UserRepository 查询User 实体以获取Collection&lt;User&gt; users。 因为在很多情况下,我想要的只是语义:

select * from blog where author_id in (some_id_list);

那么在 jpa 中有没有让我在不查询 User 实体的情况下执行如下查询?

【问题讨论】:

    标签: java sql spring hibernate hibernate-mapping


    【解决方案1】:

    您的方法中的Order 部分妨碍了您。由于您不希望结果排序,因此可以使用:

    public interface BlogRepository extends JpaRepository<Blog, Long>, CustomizedBlogRepository {
    
        Page<Blog> findByUser_IdIn(Collection<Long> userId, Pageable pageable);
    }
    

    【讨论】:

    • 我可以编写我的自定义 JPQL @Query 来实现这一点吗?
    • @user8510613 我一定是误读了这个问题。我已经编辑了我的答案 - 这就是你要找的吗?
    • 这就是我要找的
    • @user8510613 很高兴能帮上忙。考虑投票/将答案标记为正确;>
    • 此外,如果我只想将 user_id 保存在 Blog 实体中怎么办?
    【解决方案2】:

    是的,您也可以编写自定义 JPQL

    公共接口 BlogRepository 扩展 JpaRepository, CustomizedBlogRepository {

    @Query("select b from Blog b LEFT JOIN b.author.authorId in :authorIds")
    Page<Blog> getByUsersByIds(List<Integer> authorIds, Pageable pageable);
    

    }

    在这里,您可以将 authorId 更改为您创建的任何用户表的 Id。您也可以尝试 JOIN 而不是 LEFT JOIN

    【讨论】:

      猜你喜欢
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      相关资源
      最近更新 更多