Hibernate criteriaBuilder -如何实现没有外键“where in”子查询

lhcgjxsq  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(182)

我有两个实体...

@Entity
public class Thing1 {
  @Column
  long id;

  @Column
  String someReference
}

@Entity
public class Thing2 {
  @EmbeddedId
  Thing2PK id;

  @Embeddable
  public static class Thing2PK implements Serializable
  {
    @Column
    private String name;

        @Column(name = "client_id")
        private String account;

        @Column
        String possibleReference
    }
}

如何使用criteriaBuilder构建以下查询...

SELECT *
FROM thing1
WHERE someReference IN (
 SELECT possibleReference 
 FROM thing2
 WHERE name = :name)

我正在考虑criteriaBuilder.in,但这需要一组值或使用@JoinColumn的查询,在本例中,这是不可能的。

cmssoen2

cmssoen21#

已尝试。需要JoinColumn。
我在我发布的例子中没有看到连接列。将这个解决方案与我发布的文章进行比较,你会发现它非常相似。下面只是根据你的模型进行了调整。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Thing1> cq = cb.createQuery(Thing1.class);
Root<Thing1> root = cq.from(Thing1.class);
ParameterExpression<String> param = cb.parameter(String.class);
 
Subquery<String> sub = cq.subquery(String.class);
Root<Thing2> subRoot = sub.from(Thing2.class);
sub.select(subRoot.get("id").get("possibleReference"));
sub.where(cb.equal(subRoot.get("id").get("name"), param));
 
cq.where(cb.in(root.get("someReference"), sub));
 
TypedQuery<Thing1> query = em.createQuery(cq);
query.setParameter(param, "THE NAME");
List<Thing1> results = query.getResultList();

相关问题