Dan*_*nny 9 java criteria-api jpa-2.0
我正在尝试编写类似的查询
select * from Table a
where a.parent_id in
(select b.id from Table b
where b.state_cd = ?
and rownum < 100)
Run Code Online (Sandbox Code Playgroud)
使用Criteria API.我可以使用类似的代码/sf/answers/326761081/来实现查询而不使用子查询的rownum限制,但我似乎无法弄清楚如何对Subquery
Dea*_*ark 12
在Hibernate中,您可以添加实际的SQL限制,但值得注意的是这将是特定于Oracle的.如果你切换到PostgreSQL,这会破坏你需要的LIMIT 100.
DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction("rownum < 100"));
Run Code Online (Sandbox Code Playgroud)
在JPA API中,简短的回答是你不能......在你提出的问题中,你建议使用Criteria API(以及SubQuery).然而,直到你真正打电话EntityManager.createQuery(criteriaQuery)给你TypedQuery,你才会得到一个你可以指定maxResult价值的地方.
也就是说,您可以将其分为2个查询,第一个是获取内部选择结果(最多100个),然后是第二个Criteria,您将结果列表放在in():
// inner query
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<YourClass> innerCriteriaQuery = cb.createQuery(YourClass.class);
Root<YourClass> yourClass = innerCriteriaQuery.from(YourClass.class);
innerCriteriaQuery.select(yourClass).where(
cb.equal(yourClass.get(YourClass_.stateCode), someStateValue));
// list of 100 parent ids
List<YourClass> list = em.createQuery(innerCriteriaQuery).setMaxResults(100).getResultList();
// outer query
CriteriaQuery<YourClass> criteriaQuery = cb.createQuery(YourClass.class);
Root<YourClass> yourClass = criteriaQuery.from(YourClass.class);
criteriaQuery.select(yourClass).where(
cb.in(yourClass.get(YourClass_.parentId)).value(list);
return em.createQuery(criteriaQuery).getResultList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6105 次 |
| 最近记录: |