gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:25 28 4
gpt4 key购买 nike

我正在为一个新项目使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com