2017-07-26 58 views
0

說我至少有這兩個實體:現在Hibernate的標準,不同的關聯屬性

class Person { 
    String firstname, lastname; 

    Address address; 

    ManyOtherPropertiesAndEntities ...; 
} 

class Address { 
     String street; 
     Country country; 
} 

,我想查詢Person表和ONLY人住在不同的街道。

也就是說,忽略所有居住在同一條街上的人,並且只返回其中一個人,任何一個人。

我該如何執行這樣的查詢?

是否可能使用條件

Criteria criteria = session.createCriteria(Person.class, "person"); 

Criteria addressCriteria = criteria.createCriteria("address") 

criteria.setProjection(
        Projections.distinct(
         Projections.projectionList().add(Projections.property("address.street")) 
        ) 
      ); 

這真的沒有用。

我也試着做:

projectionList.add(Projections.sqlProjection("DISTINCT ON (address.street), ... ", columns.toArray(new String[columns.size()]), types.toArray(new Type[types.size()]))); 

但也無果而終。

>>>>>>>>>>>>>>>>>>>>>>>編輯< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <

我能得到這個工作,因此產生實際上在純SQL模式返回結果的SQL查詢,但似乎處於休眠返回零:

List<String> columns = Lists.lst(); 
             List<Type> types  = Lists.lst(); 

             bondCriteria.setProjection(
               Projections.sqlProjection ("DISTINCT ON (tvmux2_.polarization) * " 
                 , columns.toArray (new String[columns.size()]) 
                 , types.toArray (new Type[types.size()]) 
               ) 

               // Projections.projectionList().add(Projections.distinct(Projections.property("polarization"))) 
             ); 

             ResultTransformer resultTransformer = new ResultTransformer() { 
               @Override 
               public List transformList(List collection) { 
                 return null; 
               } 

               @Override 
               public Object transformTuple(Object[] tuple, String[] aliases) { 
                 return null; 
               } 
             }; 

             bondCriteria.setResultTransformer(resultTransformer); 

* ITS 2017年,所以仍沒有包含一個合適的編輯器來輕鬆地對代碼進行格式化,以便縮進和複製粘貼不是一個完整的地獄。隨意水平滾動。 *

這產生TEH以下查詢基本上

select DISTINCT ON (tvmux2_.polarization) * from TvChannelBond this_ inner join TvChannel tvchannel1_ on this_.channel=tvchannel1_.id inner join TvMux tvmux2_ on this_.mux=tvmux2_.id where this_.enabled=true order by tvmux2_.polarization asc limit 100 

其確實在非休眠模式返回結果。

但是,由於sqlProjection方法需要補充3個參數,所以我不確定要添加到第二個和第三個參數中。類型不能是預定義的Hibernate類型,就像DOUBLE,STRING等一樣。

調試使用ResultTransformer,它進入transformTuple具有零長度元組[]和別名[]。

可能與sqlProjection零長度類型和列列表。具有最小id

SELECT p.* 
FROM Address a 
INNER JOIN Person p ON ... 
GROUP BY a.Street 
HAVING p.id = MIN(p.id) 

此語句選擇每一個不同的StreetAddressPerson

+0

只是一個問題:爲什麼要使用Hibernate Criteria?它已被棄用且不受支持。順便說一句,對於這種要求,我會建議與本機查詢。 – galovics

+0

@galovics現在已經有一個很大的標準查詢。這只是一個插件選項,我想避免爲這種情況重寫整個查詢生成器。 標準查詢已棄用?現在提出什麼建議?不要說HQL。 – momomo

+0

@galovics看到這個https://stackoverflow.com/a/45325401/961018 ...問題現在是如何將該SQL投影到休眠條件。 – momomo

回答

0

在SQL中,你可以像這樣做。而不是MIN(p.id)你當然可以使用任何其他領域和聚合功能,每個街道只能匹配一個人; MAX(p.id)將工作,MIN(p.lastname)不會,如果在街上可以有多個「史密斯」。

您可以將上述SQL轉換爲Criteria查詢嗎?

+0

更新了編輯。基於不同的SQL查詢,在這裏找到:https://stackoverflow.com/a/45325401/961018 請注意,我知道表和屬性已更改,但這應該不重要。 – momomo

相關問題