SELECT子句中带有Subquery的JPQL / Hibernate查询

时间:2014-06-11 15:33:03

标签: java hibernate jpa jpql

我有一组JPA实体类如下(简化):

@Entity(name="region")
public class Region {

  @Id
  @Column(name="id")
  @GeneratedValue(strategy=GenerationType.AUTO)
  protected Long id;
}

@Entity(name="user")
public class User {

  @OneToMany(fetch = FetchType.EAGER)
  @JoinTable
  (
      name="user_region",
      joinColumns={ @JoinColumn(name="user_id", referencedColumnName="id") },
      inverseJoinColumns={ @JoinColumn(name="region_id", referencedColumnName="id", unique=true) }
  )
  protected Set<Region> regions;
}

每个用户都可以通过user_region表与0个或多个区域相关联。

使用JPQL,我正在尝试创建一个查询,它将为我提供一个Object []列表,其中第一项是区域,第二项是分配给该区域的用户数。

为单个区域执行此操作非常简单:

"select count(u) from " + User.class.getName() + " u " +
            "where :region member of u.regions"

这很好用。

但是我希望不必通过呼叫每个区域来打击数据库,所以想要将它们全部组合在一起。我试过了:

"select r, (" +
            "  select count(u) from " + User.class.getName() + " u " +
            "  where r member of u.regions " +
            ") from " + Region.class.getName() + " r " +
            "where r in :regionList";

但这导致每个区域的计数为零(由于单个选择返回非零结果,因此不对。)

查看相关问题的答案,SELECT部分​​中的子选择似乎不起作用,因为它们仅在WHERE和HAVING部分中允许,但是这不会抛出任何语法异常,它只有零结果伯爵,所以我对此不确定。

有谁能告诉我如何重新编写查询以使用多个区域?

将JPA 2.0与Hibernate 4.2一起使用

1 个答案:

答案 0 :(得分:1)

您可以使用以下方式实现此目的:

 select r, count(u) from " + User.class.getName() + " u inner join u.regions r where r in :regionList group by r

这可能不适用于没有用户的地区,如果区域没有用户需要,可以使用右连接。