我有一组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一起使用
答案 0 :(得分:1)
您可以使用以下方式实现此目的:
select r, count(u) from " + User.class.getName() + " u inner join u.regions r where r in :regionList group by r
这可能不适用于没有用户的地区,如果区域没有用户需要,可以使用右连接。