Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Hibernate JPA CriteriaQuery构造在返回的每行中生成一个SQL_Hibernate_Jpa_Criteria_Criteria Api - Fatal编程技术网

Hibernate JPA CriteriaQuery构造在返回的每行中生成一个SQL

Hibernate JPA CriteriaQuery构造在返回的每行中生成一个SQL,hibernate,jpa,criteria,criteria-api,Hibernate,Jpa,Criteria,Criteria Api,下面的代码检索人员列表以及他们拥有多少只狗的计数。为该查询生成一个SQL CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Tuple> query = cb.createTupleQuery(); Root<Person> person = query.from(Person.class); SetJoin<Person,Dog> dogsJoin = person.

下面的代码检索人员列表以及他们拥有多少只狗的计数。为该查询生成一个SQL

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<Person> person = query.from(Person.class);
SetJoin<Person,Dog> dogsJoin = person.join("dogs", JoinType.LEFT);
query.multiselect(
        cb.count(dogsJoin.get("id")).alias("numDogs"),
        person.alias("person")
).groupBy(person);
结果为4条SQL语句(结果列表中返回3个人实体):

但这是:

List resultList = em.createQuery("select p, count(dogs) from Person p left join p.dogs dogs group by p.id").getResultList();
结果仅执行一个SQL:

select person0_.id as col_0_0_, count(dogs1_.id) as col_1_0_, person0_.id as id10_, person0_.age as age10_, person0_.firstname as firstname10_, person0_.lastname as lastname10_ from Person person0_ left outer join Dog dogs1_ on person0_.id=dogs1_.owner_id group by person0_.id

我使用的是Hibernate 4.1.0.Final、Hibernate JPA2 1.0.1.Final,并在Postgres上运行。

每行生成一条SQL到底是什么意思?查询中返回的每个实体都有一条SQL语句。说真的,每行生成一条SQL到底是什么意思?你在看一些Hibernate日志吗?这似乎真的很奇怪。在EclipseLink中,您的查询运行良好,显然只生成一条SQL语句。添加了为澄清而生成的SQL语句,请参见。这是jpa提供者的选择,在您的例子中是Hibernate。在EclipseLink中,所有字段都通过一个查询进行检索,如第二个示例所示。
select person0_.id as col_0_0_, count(dogs1_.id) as col_1_0_ from Person person0_ left outer join Dog dogs1_ on person0_.id=dogs1_.owner_id group by person0_.id
select person0_.id as id32_0_, person0_.age as age32_0_, person0_.firstname as firstname32_0_, person0_.lastname as lastname32_0_ from Person person0_ where person0_.id=?
select person0_.id as id32_0_, person0_.age as age32_0_, person0_.firstname as firstname32_0_, person0_.lastname as lastname32_0_ from Person person0_ where person0_.id=?
select person0_.id as id32_0_, person0_.age as age32_0_, person0_.firstname as firstname32_0_, person0_.lastname as lastname32_0_ from Person person0_ where person0_.id=?
List resultList = em.createQuery("select p, count(dogs) from Person p left join p.dogs dogs group by p.id").getResultList();
select person0_.id as col_0_0_, count(dogs1_.id) as col_1_0_, person0_.id as id10_, person0_.age as age10_, person0_.firstname as firstname10_, person0_.lastname as lastname10_ from Person person0_ left outer join Dog dogs1_ on person0_.id=dogs1_.owner_id group by person0_.id