簡體   English   中英

休眠條件,不同的關聯屬性

[英]Hibernate criteria, distinct association property

說我至少有兩個實體:

class Person {
   String firstname, lastname;

   Address address;

   ManyOtherPropertiesAndEntities ...;
}

class Address {
      String street;
      Country country;   
}

現在,我想查詢“人”表和“ 居住在不同街道上的人”。

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

如何執行這樣的查詢?

那可能使用Criteria嗎?

 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和SO仍未包含適當的編輯器以輕松地設置代碼格式,從而使縮進和復制粘貼變得不完整。 隨意水平滾動。 *

這基本上生成以下查詢

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個參數,因此我不確定要在第二個和第三個參數中添加什么。 類型不能是預定義的休眠類型,例如DOUBLE,STRING等。

調試 resultTransformer時 ,它將進入帶有零長度tuple []和aliases []的 transformTuple中

可能與sqlProjection零長度類型和列列表有關。

在SQL中,您可以這樣做:

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

該語句從“具有最低id值的Person Address ”中為每個不同的Street選擇。 當然,除了MIN(p.id)您還可以使用任何其他字段和集合函數,這些函數將與每條街道上的一個人完全匹配; MAX(p.id)將起作用,如果一條街道中可以有多個“ Smith”,則MIN(p.lastname)將不會MIN(p.lastname)

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

暫無
暫無

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

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