Hibernate:使用关联的findByExample Criteria

时间:2012-02-10 14:25:52

标签: java hibernate

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

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

来做到这一点
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;
    }
}

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

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

我尝试过:

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

此处的字符串文字表示数据库中使用的列名称。这是因为它确实连接表并返回结果,其中DB中的otherName之一符合条件。但我得到重复,因为如果一个实体有两个其他名称并且搜索条件正在寻找它们两者,那么它们会显示为两个结果,因为连接创建了两行代表相同的实体但是具有两个其他名称中的每一个。 e.g:

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

将导致两行连接:

foo, bar, a
foo, bar, b

因此,当我执行criteria.list时,它返回两个实体对象,两者都是相同的对象。

有没有人知道使用Hibernate进行查找的更好方法,其中搜索实际上是查看关联(在这种情况下是与字符串集合的简单关联)?

1 个答案:

答案 0 :(得分:1)

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

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

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