Hibernate JPA CriteriaQuery构造在返回的每行中生成一个SQL
下面的代码检索人员列表以及他们拥有多少只狗的计数。为该查询生成一个SQLHibernate 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.
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