休眠标准,不同的关联 属性
Hibernate criteria, distinct association property
假设我至少有这两个实体:
class Person {
String firstname, lastname;
Address address;
ManyOtherPropertiesAndEntities ...;
}
class Address {
String street;
Country country;
}
现在,我想查询 table 和 ONLY 居住在不同街道上的人。
也就是说,忽略住在同一条街上的所有人,并且return只忽略这些人中的一个,任何一个。
如何执行这样的查询?
是否可能使用 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 查询,该查询实际上 return 导致纯 sql 模式,但似乎 return 休眠状态为零:
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
return 导致非休眠模式。
但是,由于sql投影方法需要补充3个参数,所以我不确定第二个和第三个参数应该添加什么。类型不能是预定义的 Hibernate 类型,如 DOUBLE、STRING 等。
当调试到resultTransformer时,它进入零长度元组[]和别名[]的transformTuple .
可能与 sql投影零长度 类型和列列表有关。
在 SQL 中,您可以这样做:
SELECT p.*
FROM Address a
INNER JOIN Person p ON ...
GROUP BY a.Street
HAVING p.id = MIN(p.id)
此语句从 Address
中为每个不同的 Street
选择具有最小 id
值的 Person
。除了 MIN(p.id)
之外,您当然可以使用任何其他字段和聚合函数,它们将精确匹配每条街道的一个人; MAX(p.id)
会起作用,MIN(p.lastname)
不会,如果一条街上可以有多个 "Smith"。
你能把上面的 SQL 转换成你的 Criteria 查询吗?
假设我至少有这两个实体:
class Person {
String firstname, lastname;
Address address;
ManyOtherPropertiesAndEntities ...;
}
class Address {
String street;
Country country;
}
现在,我想查询 table 和 ONLY 居住在不同街道上的人。
也就是说,忽略住在同一条街上的所有人,并且return只忽略这些人中的一个,任何一个。
如何执行这样的查询?
是否可能使用 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 查询,该查询实际上 return 导致纯 sql 模式,但似乎 return 休眠状态为零:
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
return 导致非休眠模式。
但是,由于sql投影方法需要补充3个参数,所以我不确定第二个和第三个参数应该添加什么。类型不能是预定义的 Hibernate 类型,如 DOUBLE、STRING 等。
当调试到resultTransformer时,它进入零长度元组[]和别名[]的transformTuple .
可能与 sql投影零长度 类型和列列表有关。
在 SQL 中,您可以这样做:
SELECT p.*
FROM Address a
INNER JOIN Person p ON ...
GROUP BY a.Street
HAVING p.id = MIN(p.id)
此语句从 Address
中为每个不同的 Street
选择具有最小 id
值的 Person
。除了 MIN(p.id)
之外,您当然可以使用任何其他字段和聚合函数,它们将精确匹配每条街道的一个人; MAX(p.id)
会起作用,MIN(p.lastname)
不会,如果一条街上可以有多个 "Smith"。
你能把上面的 SQL 转换成你的 Criteria 查询吗?