Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在子查询中使用JPA和JPQL限制_Sql_Hibernate_Jpa_Hql_Limit - Fatal编程技术网

Sql 在子查询中使用JPA和JPQL限制

Sql 在子查询中使用JPA和JPQL限制,sql,hibernate,jpa,hql,limit,Sql,Hibernate,Jpa,Hql,Limit,首先,我想指出,我知道如何在SQL中使用LIMIT实现这一点,但因为JPQL不允许LIMIT关键字,因此我的问题是: 我有一个返回位置及其链接标记的JPQL查询: List<Object[]> p = entityManager.createQuery(" SELECT p, t.tagName FROM Place p LEFT JOIN .... ... 我会做一个子查询,并使用其中的限制只选择我想要的地方 但是因为JPQL不允许限制,所以现在我要做的是第二次数据库调用来检索所

首先,我想指出,我知道如何在SQL中使用LIMIT实现这一点,但因为JPQL不允许LIMIT关键字,因此我的问题是:

我有一个返回位置及其链接标记的JPQL查询:

List<Object[]> p = entityManager.createQuery("
SELECT p, t.tagName
FROM Place p LEFT JOIN .... ...
我会做一个子查询,并使用其中的限制只选择我想要的地方

但是因为JPQL不允许限制,所以现在我要做的是第二次数据库调用来检索所需的placeID,并使用entityManager setMaxResult。限制。然后我将这些ID输入到另一个查询中

有没有经验丰富的人能告诉我这是否是一个好的做法?有没有其他方法可以在不进行两次单独的数据库调用的情况下完成这些工作

Ps:我在查询中直接选择t.tagName的原因是因为Place实体中的集合PlaceTag是惰性初始化的,如果我用java访问它,它将触发额外的数据库调用。。我确实尝试过这样使用JOIN FETCH:

List<Place> places = entityManager.createQuery("" +
                "SELECT p FROM Place p " +
                "JOIN FETCH p.PlaceTag pt " +
                "JOIN FETCH pt.tag t").setMaxResults(10).getResultList();
但我在查询中遇到了以下错误:

查询指定的联接获取,但获取的联接的所有者 选择列表中不存在关联

谢谢大家!

 String query =   "SELECT p FROM Place p "
                  + "JOIN p.PlaceTag pt " 
                  + "JOIN pt.tag t";
 List<Place> places = entityManager.createQuery(query)
                      .setMaxResults(10)
                      .setFirstResult((pageNumber-1) * pageSize)
                      .getResultList();
for (Place p : places) {
  for (PlaceTag pt: p.getPlaceTag())
      System.out.println(pt.getTag().getTagName());
}
 String query =   "SELECT p FROM Place p "
                  + "JOIN p.PlaceTag pt " 
                  + "JOIN pt.tag t";
 List<Place> places = entityManager.createQuery(query)
                      .setMaxResults(10)
                      .setFirstResult((pageNumber-1) * pageSize)
                      .getResultList();