【问题标题】:Criteria builder IN clause with nested query for embedded @ElementCollection用于嵌入式 @ElementCollection 的具有嵌套查询的条件生成器 IN 子句
【发布时间】:2021-01-28 17:32:30
【问题描述】:

我有 UserAddress 实体(实际上是其他实体,只是为了简化)。

@Entity
public class User {
    @Id
    @GeneratedValue
    protected long id;
    ...

    @ElementCollection
    @CollectionTable(name = "address",
        joinColumns = {@JoinColumn(name = "user_id")})
    @Column(name = "street")
    private List<Address> addresses;

    ...
}

@Embeddable
public class Address {
    private String street;
    ...
}

如何对Address 进行嵌套查询并在IN 子句中使用它?我期望的结果查询`select * from user u where u.id in (select user_id from address where street like '%Green%');

Root<User> root = ...; // Root query already exists

CriteriaQuery<Address> cq = builder.createQuery(Address.class);
Root<Address> addressRoot = cq.from(Address.class);

cq.select(addressRoot.get("user_id"))
    .where(
        builder.like(
            addressRoot.get("street"),
            "%Green%"
        )
    );

Predicate .... = criteriaQuery.where(root.get("id").in(cq))

我尝试过类似的方法,但它不起作用 - Address 它不是实体,我无法用它创建 CriteriaQuery。 重要提示:我不能使用root.join("addresses").get("street").like(...) 有几个原因

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    您需要使用存在子查询,如下所示:

    Root<User> root = ...; // Root query already exists
    
    CriteriaQuery<Address> cq = builder.createQuery(Address.class);
    Subquery<Integer> subquery = cq.subquery(Integer.class);
    Root<User> correlatedRoot = subquery.correlate(root);
    Join<User, Address> addressRoot = correlatedRoot.join("addresses");
    
    cq.select(addressRoot.get("user_id"));
    subquery.where(
            builder.like(
                addressRoot.get("street"),
                "%Green%"
            )
        );
    
    Predicate .... = criteriaQuery.where(builder.exists(subquery));
    

    【讨论】:

    • 我花了几个小时调整子查询以获得所需的结果,但似乎没有任何效果。谢天谢地,我找到了您使用 Subquery#correlate() 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2012-08-24
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多