使用JPQL键入非实体结果的查询

时间:2013-02-07 06:19:41

标签: java jpa jpql

TypedQuery<UserNameAndPostCount> query = entityManager.createQuery(
  "select new com.loki2302.JPQLTest$UserNameAndPostCount" + 
  "(u.userName, count(p.id)) " +
  "from User u " + 
  "left join u.posts p group by u.userName", UserNameAndPostCount.class);

List<UserNameAndPostCount> resultList = query.getResultList();

如果没有在JPQL查询文本中对com.loki2302.JPQLTest$UserNameAndPostCount进行硬编码,是否有任何“官方”方法可以做同样的事情?

2 个答案:

答案 0 :(得分:1)

这样的查询
entityManager.createQuery("SELECT u.userName, count(p.id) FROM User u LEFT JOIN u.posts p GROUP BY u.userName", UserNameAndPostCount.class);

可能适用于某些JPA实现,当然DataNucleus JPA旨在执行此类操作。毕竟,最后一个参数是结果类,所以它基本上是用这些结果字段作为参数创建该类型的对象(或使用名称与这两个结果字段一致的setter),并且您可以轻松地放置 select子句中的“AS {alias}”,用于获取结果字段以匹配结果类中的bean属性名称。

答案 1 :(得分:0)

要避免这种硬编码,可以使用entityManager接口的createNamedQuery(String)。 要使用此方法,您必须在模型(实体类)中创建NamedQueries,并使用Query对象而不是TypedQuery。