Tro*_*dor 8 java sql database jpa criteria-api
我正在尝试使用JPA(eclipselink)中的条件api创建后续句子,它很简单地询问某些类别中是否存在某些用户
我想要的句子:
SELECT
CASE
WHEN EXISTS
(SELECT * FROM user WHERE category = ?)
THEN true
ELSE false
END
bind => [10]
Run Code Online (Sandbox Code Playgroud)
我尝试使用此代码:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Boolean> criteriaQuery = criteriaBuilder.createQuery(Boolean.class);
Root<T> root = criteriaQuery.from(tclass);
Subquery<T> subquery = criteriaQuery.subquery(tclass);
Root<T> subroot = subquery.from(tclass);
subquery.select(subroot);
Predicate subPredicate = criteriaBuilder.equal(subroot.get("category"),category);
subquery.where(subPredicate);
Predicate predicateExists = criteriaBuilder.exists(subquery);
Case<Boolean> booleancase = criteriaBuilder.<Boolean>selectCase();
Expression<Boolean> booleanExpression =
booleancase.when(predicateExists,true)
.otherwise(false);
criteriaQuery.select(booleanExpression);
TypedQuery<Boolean> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.getResultList();
Run Code Online (Sandbox Code Playgroud)
可悲的是我的句子是跟随,我想删除最后一个"来自用户":
SELECT
CASE
WHEN EXISTS
(SELECT ? FROM user t1 WHERE (t1.category = ?))
THEN ?
ELSE ?
END
FROM user t0
bind => [1, 110, true, false]
Run Code Online (Sandbox Code Playgroud)
任何的想法?
最后我解决了:P
TypedQuery<Boolean> typedQuery =
entityManager.createQuery(criteriaQuery).setMaxResults(1);
Run Code Online (Sandbox Code Playgroud)
然后是句子(不一样,但非常接近):
SELECT
CASE
WHEN EXISTS
(SELECT ? FROM user t1 WHERE (t1.category = ?))
THEN ?
ELSE ?
END
FROM user t0 LIMIT ?, ?
bind => [1, 110, true, false,0,1]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2428 次 |
最近记录: |