【问题标题】:Hibernate: findByExample Criteria using AssociationsHibernate:使用关联的 findByExample Criteria
【发布时间】:2012-03-03 00:16:17
【问题描述】:

我正在为一个新项目使用 Hibernate 开发域模型。我有一个基本上由longName:StringshortName:StringotherNames:Collection<String> 组成的实体。

我已经能够很好地设置它,但是我现在想要处理一些 DAO 功能,这些功能将允许用户通过示例查找实体,即我应该能够创建一个实体对象并设置一些字段,然后当我将其传递给搜索时,它应该返回与已设置的字段匹配的结果列表。我知道我可以使用 Hibernate Examples 做到这一点。

public List<Entity> findByExample(EntityexampleObject) {
    try {
        Criteria criteria = getSession().createCriteria(type);
        Example example = Example.create(exampleObject).ignoreCase();
        criteria.add(example);

        @SuppressWarnings("unchecked")
        List<Entity> list = criteria.list();
        return list;
    } catch (HibernateException he) {
        return null;
    }
}

但根据我的经验和文档,执行此操作时会忽略关联。因此,我的 otherNames 字符串集合被忽略,因为它在数据库中表示为关联(一对多)。

理想情况下,我希望能够创建一个实体对象并向其添加otherName,然后我将能够找到其otherNames 集合之一与参数匹配的任何实体。

我试过了:

SortedSet<String> names = exampleObject.getNames();
if (names != null && !names.isEmpty()) {
    Criteria newCriteria = criteria.createCriteria("mappedNames");
    newCriteria.add(Restrictions.in("string", exampleObject.getNames()));
}

这里的字符串字面量代表数据库中使用的列名。这样做的原因是它确实加入了表并返回数据库中的otherNames 之一与条件匹配的结果。但是我得到了重复,因为如果一个实体有两个其他名称并且搜索条件正在寻找它们,那么它们会显示为两个结果,因为连接创建了代表同一个实体但具有其他两个名称中的每一个的两行。例如:

Entity:
    longName:foo
    shortName:bar
    otherNames:
        a
        b

将导致两行用于连接:

foo, bar, a
foo, bar, b

所以当我做criteria.list时它返回两个实体对象,它们都是同一个对象。

有谁知道使用 Hibernate 进行示例查找的更好方法,其中搜索实际上查看关联(在本例中是与字符串集合的简单关联)?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我想我自己已经找到了答案,至少对我有用。我仍然对其他输入感兴趣,但现在这就是我所做的:

    criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
    

    这告诉它返回不同的实体,并且在任何表连接的情况下,只返回根实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多