簡體   English   中英

JPA:按不同的列選擇任何行

[英]JPA: Select any row by distinct column

我有一個 SQL 表,其中包含一些這樣的數據:

------------------+------------------------+------------------------
      Name        +        Zone            +      School
-------------------------------------------+------------------------
      Joe         +  Coolzone              +   VCU
      Mike        +  ReallyCoolZone        +   ODU
      Kyle        +  NotcoolZone           +   ODU

我在這里嘗試做的是使用 JPA 僅選擇一行,包括區域和學校,其中學校是不同的。

因此,我期望結果:

CoolZone, VCU
ReallyCoolZone, ODU

我試圖在 JPA 中發出這樣的查詢,但我收到一條錯誤消息,指出返回了多個結果:

select distinct a.zone, a.school from MyEntity a

根據我所閱讀的內容,這個錯誤是有道理的,原因有兩個。 a) 當我們發出 select 語句時,我們不會返回整個實體,而是返回部分 b) jpa 不知道如何將這些值映射到我的實體。

根據我所閱讀的內容,我可以通過創建一個新的構造函數並明確說明應如何構造返回的對象來解決這個問題。 這在這篇文章中提到: https : //stackoverflow.com/a/24710759/5655414

創建新的構造函數后,我的查詢字符串等同於以下內容:

select new MyEntity(distinct a.zone, a.school) from MyEntity a

我收到一條錯誤消息:

 Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: distinct

這個應該放在什么位置? 如果這段代碼是瘋狂的並且毫無意義,是否有更有效的方法來實現我的目標?

JPA 2.0 休眠 3.4

這個問題的解決方案相當簡單。 首先,我們必須為我們尋找的多選列添加條件,並將 distinct 設置為 true:

final CriteriaBuilder builder = em.getCriteriaBuilder();
final CriteriaQuery<MyEntity> criteriaQuery = builder.createQuery(MyEntity.class);
final Root<MyEntity> myEntity= criteriaQuery.from(MyEntity.class);
final CriteriaQuery<MyEntity> select = criteriaQuery.multiselect(
                myEntity.get("zone"), versionTrack.get("school"));
select.distinct(true);

然后,我們必須為 MyEntity 類創建一個額外的構造函數,以便可以從結果中創建它:

public MyEntity(final String zone, final String school) {...}

這樣的東西行不通?

select min(a.zone), a.school from MyEntity a group by a.school

我也面臨同樣的問題。 但是閱讀了很多網站,有了解決問題的想法,現在工作正常。 JPA 構造函數不允許 ' distinct ',所以我在構造函數之外嘗試。 任何人找到了更好的解決方案,您可以發表評論。

代碼

@Query("select distinct new com.apptium.eportalcdcdaas.model.CDCField(dl.fieldname,dl.fieldDataType,dl.fieldDesc,"
            + "dl.fieldPath,dl.parentdomainid,dl.primaryKey) from Delta dl where dl.accountName = ?1 and dl.applicationName = ?2"
            + " and dl.domainid = ?3 and dl.subDomainid = ?4")
    List getFieldWithDomainAndSubDomain(String accountname, String applicationname, String domainId,
            String subDomainId);

暫無
暫無

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

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