java - 使用 IN 运算符在多对多关系中进行 JPA 条件查询

标签 java sql hibernate jpa hibernate-criteria

我有以下两个实体:

简介、类别

在配置文件实体中,我有一个配置文件具有的类别列表

在类别实体中,我有一个类别具有的配置文件列表

生成的表名为 profiles_has_categories,包含以下列:

profile_id, category_id

我想找到属于具有以下 ID 1、2、3、4 的任何类别的所有配置文件

我会在纯 sql 中使用:

SELECT p.* FROM profiles p, profiles_has_categories phc 
WHERE p.id = phc.profile_id 
AND phc.category_id IN (1, 2, 3, 4)

但我不知道如何使用 CriteriaBuilder 在 JPA 中构建查询:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Profile> criteria = cb.createQuery(Profile.class);
Root<Profile> root = criteria.from(Profile.class);

// Profile_.categories is a collection of Category objects
// categories is collection of Long (category ids) that i want to search in
// but is not working
criteria.where(root.get(Profile_.categories).in(categories))

List<Profile> results = em.createQuery(criteria).getResultList();

最佳答案

你不需要get,你想要join:

criteria.where(root.join(Profile_.categories).in(categories))

关于java - 使用 IN 运算符在多对多关系中进行 JPA 条件查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31125443/

相关文章:

java - 通过 JCo 以事务方式调用 BAPI RFC

java - 将 oneToMany 与可连接但一起使用,将其映射到子实体

java - 用户删除该表中的某些信息后 JSP 表消失

mySQL SELECT 使用 LEFT JOIN,返回值或 NULL WHERE 列在右表中指定

sql - Between 子句 - 我是否必须重新排序参数?

java - 如何在 Java 中将 TemporalType.TIMESTAMP 转换为 Date()?

mysql - 如何处理 org.hibernate.exception.ConstraintViolationException,我使用 try catch 但它不起作用

java - 我怎么知道为什么我的应用程序使用 PostgreSQL 9、hibernate 4.3.5 和 c3p0 挂起?

java.lang.NullPointerException xml解析

java - Java Web应用程序中主要方法的用途