我有一张桌子
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;
}
这对我有用
列表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();
}
对于使用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与子查询一起使用。