【问题标题】:Hibernate: create HQL Query with Attribute values from SetsHibernate:使用集合中的属性值创建 HQL 查询
【发布时间】:2015-01-20 10:07:11
【问题描述】:

我想创建一个可以访问一组指定对象的属性的 HQL 查询,让我通过一个简短的例子来解释一下

班级组织

public class Organization ...{
    private int orgid;
    private Set<DomainValue> languages = new HashSet<language>(0);
    private Set<Address> adresses = new HashSet<Address>(0);
    ...
}

班级地址

public class Address  implements java.io.Serializable {
   private int addressId;
   private String city;
   private String postalCode;
   private String streetName;
   private String houseNumber;
   ...
}

语言

public class Orgunitlanguage  implements java.io.Serializable {
   private int orgLanguageId;
   private Orgunit orgunit;
   private Integer languageCd;
   ...
}

这些示例是工作休眠 POJO 的代码 sn-ps。所以我有一个可以有多种地址和语言的组织。

我希望用户指定搜索条件,但将它们限制为每种类型,因此只有一种语言、一个邮政编码等。

假设用户想要门牌号为 22 的英文组织

所以我会像这样构建一个 hql 查询:

"from organization o where o.languages.languageCd = 1 AND o.addresses.housenumber = 22"

好吧,那不起作用(非法语法)我如何以正确的方式访问这些集合?请记住,我想访问一个特定的属性,而不仅仅是整个对象(这很容易)。

我似乎找不到我理解的文档,所以稍微解释一下就好了。

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    查询集合的正确方法是这样的

    from Organization o join o.languages l join o.addresses a where l.languageCd = 1 AND a.housenumber = 22
    

    但是,此查询将返回具有至少一种 语言为languageCd = 1至少一种 地址为housenumber = 22 的任何组织。它不会过滤掉不符合条件的语言和地址。查看this answer 以获得更多解释。

    【讨论】:

    • 这很好用,我有点失望你,hibernate 并没有提供比数据库更少的解决方案来寻址集合。非常感谢。顺便说一句,目前只有整个组织都需要该语言,所以它可以正常工作,因为对于每个地址,都有另一个带有本地语言的条目,在简短的示例中没有显示。
    • Np,很高兴我能帮上忙。
    猜你喜欢
    • 2016-04-21
    • 2012-02-19
    • 2012-01-29
    • 2016-04-08
    • 1970-01-01
    • 2010-09-09
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多