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));
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<>();

    // ...
}

这个 SQL 似乎给了我想要的结果,但我不知道如何使用 Hibernate 标准来表示它。

SELECT * FROM PRODUCT WHERE (SELECT COUNT(*) FROM PRODUCT_ALLERGEN WHERE product_id = PRODUCT.id AND allergen_id = 0) = 0;

最佳答案

使用 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。通常我使用注入(inject)来实现这一点,但还有其他方法,例如使用工厂。

关于java - 查找没有多对多关系的 Hibernate 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40173274/

相关文章:

java - Android,在Java中用px设置WebView尺寸

java - 数据报套接字 "must be caught or declared to be thrown"

java - 列类型的奇怪 Hibernate 异常

java - Spring Boot 测试 - 没有 'com.example.MyService' 类型的合格 bean 可用

java - 使用 JVM Nashorn (Play Framework) 呈现 React.js 时出错。我得到 "null is not a function"

java - hibernate 、MySql、 Spring

java - 无法使用 java 使用 DeleteDbFiles.execute 删除我的 h2 数据库文件

java - 将 TIMESTAMPDIFF 与 JPA 条件查询一起使用,并将 hibernate 作为提供者

java - JPA 2 Criteria 与抽象集合相结合

java - 为什么我在运行程序时无法检索按钮?