休眠条件,不同的关联属性



假设我至少有以下两个实体:

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 和 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时,它会进入具有零长度元组 [] 和别名 [] 的转换元组。

可能与sqlProjection 零长度类型和列列表有关。

在SQL中,你可以这样做:

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

此语句从AddressPerson中为每个不同的Street选择具有最小id值。除了MIN(p.id),您当然可以使用任何其他字段和聚合函数,这些字段和聚合函数将完全匹配每条街道的一个人;MAX(p.id)会起作用,但如果一条街上可以有多个"史密斯",MIN(p.lastname)不会。

您可以将上述 SQL 转换为条件查询吗?

最新更新