2016-02-18 50 views
0

我有一個POJO命名SiteProperty所有不同行,如下所示:的Hibernate查詢來獲取基於WHERE條件

public class SiteProperty 
{ 
    private int sitePropertyId; 
    private int siteId; 
    private String key; 
    private String value; 
    private String type; 
} 

有沒有什麼辦法讓value對於給定的siteId所有不同的值? value也可能與siteId 0在一起。所以基本上查詢應該得到siteId 0的所有行,然後如果value中的任何一個出現在指定的siteId中,那麼該行必須返回內部爲siteId 0 。

我使用PostgreSQL數據庫爲我的應用程序。

我對此很新。任何建議,將不勝感激。謝謝。

Basicaly我有很多valuekey對在表中爲siteId 0,這是默認值。對於siteId的某些值,對於相同的key可以有不同的value。如果對於siteIdvalue對應於key它必須被退回,否則value對應於key對應siteId 0應該被返回。而返回的數據應該是SiteProperty

我已經嘗試了樣品SQL查詢中pgAdmin的工具測試結果我收到類型的列表:

select * from site_property where site_key IN (SELECT DISTINCT site_key FROM site_property where site_id = 0 or site_id = 3) and site_id = 0 or site_id = 3; 

此查詢只是一個試驗,其結果讓我與siteId的數據組合。

+0

你嘗試過什麼?具體問題是什麼? –

+0

@JBNizet,我已經更新了我在問題 –

+0

中的問題,我已經理解了您的要求。但是,在嘗試實施解決方案時,您遇到了什麼問題?你的嘗試在哪裏? –

回答

1

您需要添加一個ProjectionCriteria(這是一個建設者,類查詢):

Criteria criteria = getCurrentSession().createCritiera(SiteProperty.class); 
criteria.add(Projections.distinct(Projections.property("value"))); 
criteria.add(Restrictions.eq("siteId", 0)); 
List<String> resultList = critiera.list(); 
+0

爲什麼使用這種靜態查詢的標準而不是HQL?另外,您的查詢不會返回List 。 –

+0

我不太喜歡HQL。你可以很容易地做一個錯字或構造太長時間(和錯誤)。我更喜歡去Criteria API。 –

+0

您幾乎可以輕鬆地使用Criteria寫出錯誤的東西,並且您始終會編寫比'從SiteProperty sp中選擇不同的sp.value更加可讀的內容,其中sp.siteId =:siteId'。無論如何,自動化測試對於兩者都是必要的。另外,SiteProperty_.value是一個SingularAttribute,Projections.property()需要一個String。您正在使用標準JPA標準API使用的標準JPA元數據類與舊的專有Hibernate API。 –