如何将SQL转换为休眠或蚀链接的JPA标准查询

问题描述 投票:0回答:2

我有一张桌子

Id      value 
1000    null
1000    En
1000    Fr
1000    Es
1001    En
1001    Fr
1001    Es

选择查询的输出应如下。 (因为1000仅具有空值,所以选择具有空值的行)

Id      value
1000    null
1001    En
1001    Fr
1001    Es

我从流程(How to to give preference to null value during select)的堆栈中获得了如下所示的选择查询,如何将同一查询转换为用于休眠或日食链接的jpa条件

select query 
SELECT t1.id,
       t1.value
       FROM elbat t1
       WHERE NOT EXISTS (SELECT *
                                FROM elbat t2
                                WHERE t2.id = t1.id
                                      AND t2.value IS NULL)
              OR t1.value IS NULL;

假设我的实体类是类测试{

private String id;

private String value;

}

hibernate eclipselink criteria
2个回答
0
投票

这对我有用

列表getTests(){

            final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
            final CriteriaQuery<Test> criteriaQuery = criteriaBuilder.createQuery(Test.class);

            Root<Test> TestRoot = criteriaQuery.from(Test.class);

            Subquery<Test> subquery = criteriaQuery.subquery(Test.class);

            Root<Test> subQueryTestRoot = subquery.from(Test.class);

            subquery.where(criteriaBuilder.and(subQueryTestRoot.get(Test_.value).isNull()), criteriaBuilder
                    .equal(TestRoot.get(Test_.id), subQueryTestRoot.get(Test_.id)));


            criteriaQuery.where(criteriaBuilder.or(TestRoot.get(Test_.value).isNull(), criteriaBuilder.not(criteriaBuilder.exists(subquery))));

            TypedQuery<Test> typedQuery = entityManager.createQuery(criteriaQuery);


            return typedQuery.getResultList();
        }

-1
投票

对于使用createQuery的jpa条件,

List<Object> list = entityManager.createQuery("SELECT t1.id, t1.value 
    FROM elbat t1 WHERE NOT EXISTS (SELECT * FROM elbat t2 WHERE t2.id = t1.id 
       AND t2.value IS NULL) OR t1.value IS NULL")
    .getResultList();

如果您有可用的实体,则可以将CriteriaBuilder与子查询一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.