Hibernate标准,不同的关联属性

时间:2017-07-26 10:51:56

标签: java sql hibernate criteria hibernate-criteria

假设我至少有这两个实体:

class Person {
   String firstname, lastname;

   Address address;

   ManyOtherPropertiesAndEntities ...;
}

class Address {
      String street;
      Country country;   
}

现在,我想查询人员表和 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模式返回结果,但似乎在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);

* 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个参数,我不知道要添加到第二个和第三个参数中。类型不能是预定义的Hibernate类型,而是DOUBLE,STRING等。

调试进入 resultTransformer 时,它会进入transformTuple,长度为元组[]和别名[]。

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

1 个答案:

答案 0 :(得分:0)

在SQL中,你可以这样做:

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

此语句从Street Address中选择具有最小Person值的每个不同id。您可以使用任何其他字段和聚合函数代替MIN(p.id),而每个街道只能匹配一个人; MAX(p.id)将有效,MIN(p.lastname)如果街道上可能有多个“史密斯”,则不会{。}}。

您可以将上述SQL转换为您的Criteria查询吗?