在JPA Query上设置ORDER BY和LIMIT子句

时间:2013-12-30 23:36:30

标签: java mysql sql hibernate jpa

我对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降序排序,这是一个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,但它伤害了我的大脑。

对于这一点,我总共n00b,非常感谢任何帮助!

2 个答案:

答案 0 :(得分:7)

我认为你需要

q.setMaxResults(1);

另见这里接受的答案。

How do you do a limit query in HQL?

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

答案 1 :(得分:2)

JPQL相当于LIMIT start,最大值为:

setFirstResultsetMaxResults

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