gpt4 book ai didi

java - 子查询中的条件 API 限制结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:01 24 4
gpt4 key购买 nike

我正在尝试编写类似于

的查询
select * from Table a
where a.parent_id in
(select b.id from Table b
where b.state_cd = ?
and rownum < 100)

使用 Criteria API .我可以使用类似于 https://stackoverflow.com/a/4668015/597419 的代码在子查询上没有 rownum 限制的情况下实现查询。但我似乎无法弄清楚如何对 Subquery 施加限制

最佳答案

Hibernate 中,您可以添加实际的 SQL 限制,但值得注意的是,这将是特定于 Oracle 的。如果您切换到 PostgreSQL,这会中断,您需要 LIMIT 100

DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction("rownum < 100"));

JPA API 中,简短的回答是您不能...在您提出的问题中,您建议使用 Criteria API(连同 SubQuery)。但是,直到您实际调用 EntityManager.createQuery(criteriaQuery) 后,您才会获得一个 TypedQuery,您可以在其中指定 maxResult 值。

就是说,您可以将它分成 2 个查询,第一个是您获得内部选择结果(最多 100 个)的地方,然后是第二个 Criteria ,您在 中获取结果列表>在():

// 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();

关于java - 子查询中的条件 API 限制结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37187193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com