簡體   English   中英

帶有SELECT子句中的子查詢的JPQL /休眠查詢

[英]JPQL/Hibernate query with Subquery in SELECT clause

我有一組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

您可以使用以下方法實現此目的:

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

這對於沒有用戶的區域可能不起作用,如果不需要用戶,則可以使用右聯接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM