首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate准则,不同的关联属性

Hibernate准则,不同的关联属性
EN

Stack Overflow用户
提问于 2017-07-26 10:51:55
回答 1查看 605关注 0票数 0

至少我有这两个实体:

代码语言:javascript
复制
class Person {
   String firstname, lastname;

   Address address;

   ManyOtherPropertiesAndEntities ...;
}

class Address {
      String street;
      Country country;   
}

现在,我想查询Person表和仅居住在不同街道上的Person。

也就是说,忽略所有住在同一条街的上的人,只返回其中的一个人,任何一个。

我如何执行这样的查询?

这是否可能使用准则

代码语言:javascript
复制
 Criteria criteria = session.createCriteria(Person.class, "person");

 Criteria addressCriteria = criteria.createCriteria("address")

 criteria.setProjection(
                    Projections.distinct(
                        Projections.projectionList().add(Projections.property("address.street"))
                    )
            );

这不太管用。

我也试过这样做:

代码语言:javascript
复制
projectionList.add( Projections.sqlProjection("DISTINCT ON ( address.street ), ... ", columns.toArray(new String[columns.size()]), types.toArray(new Type[types.size()])));

但也没有结果。

>>>>>>>>>>>>>>>>>>>>>>>EDIT<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

我能够让它运行,并生成一个SQL查询,该查询实际上以纯sql模式返回结果,但在hibernate中似乎返回零:

代码语言:javascript
复制
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基本上生成以下查询

代码语言:javascript
复制
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零长度类型和列列表有关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-26 11:39:18

在SQL中,您可以这样做:

代码语言:javascript
复制
SELECT p.*
FROM Address a
INNER JOIN Person p ON ...
GROUP BY a.Street
HAVING p.id = MIN(p.id)

此语句为每个不同的StreetAddress中选择具有最小id值的Person。当然,您可以使用任何其他字段和聚合函数来代替MIN(p.id),这些字段和聚合函数将与每个街道上的一个人完全匹配;MAX(p.id)会工作,如果一条街上有一个以上的"Smith“,MIN(p.lastname)就不会工作。

能否将上面的SQL转换为标准查询?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45324808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档