Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找没有多对多关系的Hibernate对象_Java_Hibernate - Fatal编程技术网

Java 查找没有多对多关系的Hibernate对象

Java 查找没有多对多关系的Hibernate对象,java,hibernate,Java,Hibernate,我需要使用Hibernate找到所有不含特定过敏原的产品 以下是用于创建数据库表的SQL: CREATE TABLE ALLERGEN (id integer IDENTITY PRIMARY KEY, name varchar(20), UNIQUE (id), UNIQUE(name)); CREATE TABLE PRODUCT (id integer IDENTITY PRIMARY KEY, name varchar(20), UNIQUE (id), UNIQUE(name)); C

我需要使用Hibernate找到所有不含特定过敏原的产品

以下是用于创建数据库表的SQL:

CREATE TABLE ALLERGEN (id integer IDENTITY PRIMARY KEY, name varchar(20), UNIQUE (id), UNIQUE(name));
CREATE TABLE PRODUCT (id integer IDENTITY PRIMARY KEY, name varchar(20), UNIQUE (id), UNIQUE(name));
CREATE TABLE PRODUCT_ALLERGEN (product_id integer, allergen_id integer, UNIQUE (product_id, allergen_id), FOREIGN KEY (product_id) REFERENCES PRODUCT (id), FOREIGN KEY (allergen_id) REFERENCES ALLERGEN (id));
以下是Hibernate注释的Java类:

@Entity
@Table(name = "ALLERGEN")
class Allergen {

    @Id
    @Column(unique = true, nullable = false)
    @GeneratedValue
    private Integer id;
    private String name;

    // ...
}

@Entity
@Table(name = "PRODUCT")
public class Product {

    @Id
    @Column(unique = true, nullable = false)
    @GeneratedValue
    private Integer id;
    private String name;
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(inverseJoinColumns = {@JoinColumn(name = "allergen_id")})
    private final Set<Allergen> allergens = new HashSet<>();

    // ...
}

使用Criteria API,您应该能够通过创建产品到过敏原的左连接并检查其是否为空,从而获得所有不含过敏原的产品:

final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Product> c = builder.createQuery(Product.class);
final Root<Product> root = c.from(Product.class);
Join<Product, Allergen> allergenJoin = root.join("allergens", JoinType.LEFT);
c.where(builder.isNull(allergenJoin));
c.select(root);
List<Product> = entityManager.createQuery(c).getResultList(); 

注意:我没有包括EntityManager的来源。通常我使用注射,但也有其他方法,比如使用工厂。

此代码使用JPQL获得没有特定过敏原的产品

List<Product> results = manager.createQuery(
        "SELECT p from Product AS p WHERE (SELECT COUNT(a) FROM p.allergens a WHERE a.name = :an) = 0",
        Product.class)
    .setParameter("an", "nuts")
    .getResultList();

您想要HQL中的查询,还是使用Criteria API?我正在Criteria API中寻找解决方案,但HQL中的等效解决方案也会引起兴趣。我意识到这个答案是正确的,但我的问题模棱两可。我的意思是找到不含特定过敏原的产品。没有发现不含任何过敏原的产品。。
List<Product> results = manager.createQuery(
        "SELECT p from Product AS p WHERE (SELECT COUNT(a) FROM p.allergens a WHERE a.name = :an) = 0",
        Product.class)
    .setParameter("an", "nuts")
    .getResultList();