2012-06-06 3 views
1

Допустим, это мои объекты:Hibernate (или нет): запрос на ранее заселена Iterable <Entity>

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 
    // ... 

} 

Таблица3.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 Lucene выполнять поиск доступа пользователей в пределах Table1 строк, предварительно проиндексированных Луценой. Как только я получу некоторые результаты, я должен предложить некоторые фильтры/сортировки в возвращаемом списке, например. выбирая язык связанного объекта Table3.

Любое предложение будет оценено :)

ответ

1

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"; 
... 

Но убедитесь, что вы не слишком много кодов, и вы не попадайте в ограничение, налагаемое вашей базой данных (Oracle ограничивает элементы предложения IN до 1000, например).

Если эти объекты уже загружены в память, вы также можете просто перебирать их:

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

Спасибо! Я попробую с предложением 'IN'. – sp00m

 Смежные вопросы

  • Нет связанных вопросов^_^