【问题标题】:Setting ORDER BY and LIMIT clause on JPA Query在 JPA 查询上设置 ORDER BY 和 LIMIT 子句
【发布时间】:2014-01-17 22:04:52
【问题描述】:

我对 Hibernate 和 JPA 非常非常陌生。我希望能够将 ORDER BY 和 LIMIT 子句应用于 Hibernate(?) 查询,但现在是空的。 注意:我继承了此代码。

这是当前代码:

public SomeCoolResponse getSomeCoolResponse(String myId) {
    String queryString = "select aThing from AWholeBunchOfThings aThing " +
    "join aThing.thisOtherThing oThing join oThing.StillAnotherThing saThing " + 
    "where saThing.subthing.id = :id";

    Query q = getEntityManager().createQuery(queryString);
    q.setParameter("id", myId);

    List<MyThings> list = q.getResultList();

    if(list.size() > 0) {
        return list.get(0);
    }
    return null;
}

我希望能够应用LIMIT 0,1 子句,以便查询更快,而不是获取整个列表然后只返回第一个结果(这是我们唯一需要的)。此外,查询需要按aThing.created 降序排序,aThing.created 是一个 UNIX 时间戳整数。

我试过像这样改变queryString

String queryString = "select aThing from AWholeBunchOfThings aThing " +
    "join aThing.thisOtherThing oThing join oThing.StillAnotherThing saThing " + 
    "where saThing.subthing.id = :id ORDER BY aThing.created LIMIT 0,1";

但是 Hibernate 仍然返回整个集合。

我曾考虑使用 JPA CriteriaBuilder API,但它伤了我的脑筋。

在这方面我是个十足的人,非常感谢任何帮助!

【问题讨论】:

  • JPQL 不是 SQL;不支持 limit 等数据库细节。

标签: java mysql sql hibernate jpa


【解决方案1】:

我觉得你需要

q.setMaxResults(1);

另请参阅此处接受的答案。

How do you do a limit query in HQL?

至于“order by”子句,您可以将其包含在queryString中。

【讨论】:

  • 那我应该可以使用q.getSingleResult()吗?
  • @daniel0mullins 你的意思是 uniqueResult()?只需调用 setMaxResults,您的查询将最多返回一条记录。如果您查看生成的 SQL,我认为它将包含 LIMIT 子句,因此这正是您所需要的。
  • @daniel0mullins 好的,我以为我们在谈论 org.hibernate.Query。
  • 就像我说的 - 总共 n00b
  • @daniel0mullins 然后看这里。 stackoverflow.com/questions/11655870/…
【解决方案2】:

与 LIMIT start,max 等效的 JPQL 是:

setFirstResultsetMaxResults

q.setFirstResult(start); 
q.setMaxResults(limit);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多