gpt4 book ai didi

java - hibernate (或不 hibernate ): querying on a previously populated Iterable

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:44 24 4
gpt4 key购买 nike

假设这些是我的实体:

Table1.java

@Entity
public class Table1 {

// Many to one
private Table2 table2;

// Raw attributes
// ...

}

Table2.java

@Entity
public class Table2 {

// Many to one
private Table3 table3;

// Raw attributes
// ...

}

Table3.java

@Entity
public class Table3 {

// Raw attributes
private String lang; // "fr", "en", "de"...

}

当我想列出所有 Table1 时其属性 table2.table3.lang 的行等于 en ,我这样做:

Query query = entityManager.createQuery("SELECT t1 FROM Table1 t1 WHERE t1.table2.table3.lang = :lang");
query.setParameter("lang", "en");

也就是说,我如何在先前填充的 Iterable<Table1> 上执行该查询?难道只有这样可行吗?如果不使用 Hibernate,那么使用什么?例如,即使我知道下面的代码不起作用,例如:

Set<Table1> set = new HashSet<Table1>();
set.add(new Table1(INIT_DEFAULT_VALUES));
set.add(new Table2(INIT_DEFAULT_VALUES));
set.add(new Table3(INIT_DEFAULT_VALUES));

Query query = entityManager.createQuery("SELECT t1 FROM :set t1 WHERE t1.table2.table3.lang = :lang");
query.setParameter("set", set);
query.setParameter("lang", "en");

对于那些想知道为什么我需要这样的东西的人,我正在使用 Apache LuceneTable1 内执行用户搜索行,之前也由 Lucene 索引。一旦我得到一些结果,我必须在返回的列表上提出一些过滤器/排序,例如选择链接的语言 Table3实体。

如有任何建议,我们将不胜感激 :)

最佳答案

Hibernate 查询被转换为 SQL 查询并在数据库中执行。如果该集合包含未进入数据库的实体实例,则 Hibernate 无法查询它们。

如果这些实体实际上是来自数据库的实体,正如您似乎指出的那样,那么您可能只使用 IN 子句:

Set<Long> ids = createSetOfIdsFromEntities(set);
String hql = select t1 FROM Table1 t1 WHERE t1. id in (:ids) and t1.table2.table3.lang = :lang";
...

但请确保您没有太多 ID,并且没有达到数据库施加的限制(例如,Oracle 将 IN 子句的元素限制为 1000)。

如果这些实体已加载到内存中,您也可以迭代它们:

Set<Table1> found = new HashSet<Table1>();
for (Table1 t1 : set) {
if (t1.getTable2().getTable3().getLang().equals(theLang)) {
found.add(t1);
}
}

关于java - hibernate (或不 hibernate ): querying on a previously populated Iterable<Entity>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912133/

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