java - Hibernate:使用关联的 findByExample 条件

标签 java hibernate

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

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

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到它,然后我就可以找到任何实体,其中一个是他们的 otherName 集合。 s 匹配参数。

我试过:

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

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

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

将产生两行用于连接:

foo, bar, a
foo, bar, b

所以当我执行 criteria.list 时,它会返回两个实体对象,这两个对象都是同一个对象。

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

最佳答案

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

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

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

关于java - Hibernate:使用关联的 findByExample 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229288/

相关文章:

java - 纳秒甘特图

java - 将对象持久保存到 MySQL 数据库时,Hibernate 不会编码 UTF-8

java - 如何在 Android 中找到路径中的所有点?

java - 如何将 'main/src/.../messages.properties' 文件添加到 ShrinkWrap WebArchive?

java - SpringBoot单元测试不使用Application类的@EnableAutoConfiguration注解

hibernate - 如何强制 Hibernate 在其实体之一发生更改时不将更改传播到数据库

java - 使用 hibernate 和 maven 从数据库生成 Java 类 - AnnotationConfiguration 丢失?

hibernate - hibernate -如何与孤儿一起保存 parent

java - 将日期从一种格式转换为另一种格式时出错

java - system.properties 只是 Heroku 的东西吗?