Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate条件,不同的关联属性_Java_Sql_Hibernate_Criteria_Hibernate Criteria - Fatal编程技术网

Java Hibernate条件,不同的关联属性

Java Hibernate条件,不同的关联属性,java,sql,hibernate,criteria,hibernate-criteria,Java,Sql,Hibernate,Criteria,Hibernate Criteria,假设我至少有这两个实体: class Person { String firstname, lastname; Address address; ManyOtherPropertiesAndEntities ...; } class Address { String street; Country country; } 现在,我想查询Person表,只查询住在不同街道上的人 也就是说,忽略住在同一条街上的所有人,只返回其中一人,任意一人 如

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

class Person {
   String firstname, lastname;

   Address address;

   ManyOtherPropertiesAndEntities ...;
}

class Address {
      String street;
      Country country;   
}
现在,我想查询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()])));
但也没有结果


>>>>>>>>>>>>>>>>>>>编辑在SQL中,您可以这样做:

SELECT p.*
FROM Address a
INNER JOIN Person p ON ...
GROUP BY a.Street
HAVING p.id = MIN(p.id)
此语句为每个不同的
街道
地址
选择具有最小
id
值的
人员
。您当然可以使用任何其他字段和聚合函数,而不是
MIN(p.id)
,这些字段和聚合函数将精确匹配每条街道上的一个人
MAX(p.id)
有效,如果一条街上有多个“史密斯”,则
MIN(p.lastname)
无效


您能将上述SQL转换为您的条件查询吗?

只是一个问题:为什么要使用Hibernate条件?它已弃用,不受支持。顺便说一句,对于这种需求,我建议使用本机查询。@galovics已经有了一个大的条件查询。这只是一个附加选项,我不想在这种情况下重写整个查询生成器。不推荐使用条件查询?现在有什么建议?不要说HQL。@galovics看到了。。。现在的问题是如何将sql投影转换为hibernate标准。建议您使用JPA标准中现在的标准API,而不是hibernate的专有标准API。^^^用编辑更新用编辑更新。基于一个不同的sql查询,可以在这里找到:注意,我知道表和属性已经更改,但这在这里并不重要。
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
SELECT p.*
FROM Address a
INNER JOIN Person p ON ...
GROUP BY a.Street
HAVING p.id = MIN(p.id)