【问题标题】:How to resolve Oracle's 'rownum' pseudocolumn with JPA Criteria API?如何使用 JPA Criteria API 解决 Oracle 的“rownum”伪列?
【发布时间】:2014-01-03 20:01:41
【问题描述】:

我想使用 JPA 标准从数据库中获取第一行。我使用 JPA,休眠 4.2.7。 在 SQL 中,语句如下所示:

SELECT * FROM houses WHERE rownum = 1;

我要实现的 Java 代码如下所示:

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<House> query = builder.createQuery(House.class);
    Root<House> root = query.from(House.class);

    query.select(root).where(builder.equal(root.get("rownum"), 1));

    TypedQuery<House> tQuery = entityManager.createQuery(query); 
    House house = tQuery.getSingleResult();

但 'rownum' 伪列无法解析,出现异常:

 java.lang.IllegalArgumentException: Unable to resolve attribute [rownum] against path
at org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:120)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:229)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:200)

有可能,如果有,如何使用 Criteria API 获取“rownum”伪列?感谢您的任何建议。

【问题讨论】:

  • 您不能在标准 api 中使用伪列。

标签: java hibernate jpa


【解决方案1】:

您可以使用 setFirstResult 和 setMaxResults 完成此操作。

session.createCriteria(Foo.class)
   .setFirstResult(0)
   .setMaxResults(1);

【讨论】:

  • 这就是 JPA 的美妙之处,不管数据库如何管理限制,因为 JPA 总是相同的 sintaxis
  • 对于我的实体管理器示例,它将是:tQuery.setFirstResult(0); tQuery.setMaxResults(1);感谢您的回答!
  • JPA 是否使用数据库特定方言创建高效查询(Oracle 为 rownum,其他支持的数据库为 TOP/LIMIT)?
  • 如果查询是这样的,那么我认为我们不能使用setMaxResults。例如:从表中选择 1,其中 col1= 'someValue' 和 ROWNUM
【解决方案2】:

您可以在查询的属性中设置rownum或limits;

Query q =entityManager.createQuery("select * from employee_table");

q.setFirstResult(0);

q.setMaxResults(30);

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 2014-09-01
    • 2011-03-30
    • 2019-01-17
    • 1970-01-01
    • 2021-12-22
    • 2013-07-12
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多