說我至少有這兩個實體:現在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)
此語句選擇每一個不同的Street
從Address
的Person
:
只是一個問題:爲什麼要使用Hibernate Criteria?它已被棄用且不受支持。順便說一句,對於這種要求,我會建議與本機查詢。 – galovics
@galovics現在已經有一個很大的標準查詢。這只是一個插件選項,我想避免爲這種情況重寫整個查詢生成器。 標準查詢已棄用?現在提出什麼建議?不要說HQL。 – momomo
@galovics看到這個https://stackoverflow.com/a/45325401/961018 ...問題現在是如何將該SQL投影到休眠條件。 – momomo