至少我有这两个实体:
class Person {
String firstname, lastname;
Address address;
ManyOtherPropertiesAndEntities ...;
}
class Address {
String street;
Country country;
}现在,我想查询Person表和仅居住在不同街道上的Person。
也就是说,忽略所有住在同一条街的上的人,只返回其中的一个人,任何一个。
我如何执行这样的查询?
这是否可能使用准则?
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()])));但也没有结果。
>>>>>>>>>>>>>>>>>>>>>>>EDIT<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
我能够让它运行,并生成一个SQL查询,该查询实际上以纯sql模式返回结果,但在hibernate中似乎返回零:
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);*它的2017年和现在还没有一个合适的编辑器来方便地格式化代码,这样缩进、复制和粘贴就不是完全的地狱了。可以自由地水平滚动。*
THis基本上生成以下查询
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返回的结果是非hibernate模式.
但是,由于sqlProjection方法需要补充3个params,所以我不知道在第二个和第三个参数中添加什么。类型不能是预定义的Hibernate类型,如DOUBLE、STRING等。
当resultTransformer,调试时,它将进入具有零长度tuple[]和aliases[].的transformTuple。
可能与sqlProjection零长度类型和列列表有关。
发布于 2017-07-26 11:39:18
在SQL中,您可以这样做:
SELECT p.*
FROM Address a
INNER JOIN Person p ON ...
GROUP BY a.Street
HAVING p.id = MIN(p.id)此语句为每个不同的Street从Address中选择具有最小id值的Person。当然,您可以使用任何其他字段和聚合函数来代替MIN(p.id),这些字段和聚合函数将与每个街道上的一个人完全匹配;MAX(p.id)会工作,如果一条街上有一个以上的"Smith“,MIN(p.lastname)就不会工作。
能否将上面的SQL转换为标准查询?
https://stackoverflow.com/questions/45324808
复制相似问题