2015-05-05 3 views
2

Update: смотрите мой ответ ниже, как проверить, если 2 список пересекается (как для @ElementCollection со струнными/перечислениями и обычным списком субъектов, отображенных как @OneToMany)HQL. Пересечение двух списков

У меня есть объект, который содержит @ElementCollection поля с перечислениями.

public enum StatusType { 
    NEW, PENDING, CLOSED; 
} 

@Entity 
public class MyEntity { 
    @ElementCollection 
    @CollectionTable(name = "status_type", joinColumns = {@JoinColumn(name = "my_entity_id")}) 
    @Column(name = "status_type", nullable = false) 
    private Set<StatusType > statusTypes = new HashSet<StatusType >(); 

    ... 
} 

Теперь я хочу, чтобы получить все объекты, которые содержат статус NEW или PENDING (или оба).

Я пытаюсь использовать этот запрос:

SELECT DISTINCT u FROM MyEntity u WHERE u.statusTypes in :statusTypes 

Но я получаю исключение: org.postgresql.util.PSQLException: No value specified for parameter 9.

Как правильно запрашивать по коллекциям и фильтру по перекресткам?

ответ

2

Проблема решена путем добавления пункта JOIN в HQL. Hibernate не мог неявно признать, что для запроса требуется предложение JOIN. Может быть, это поможет кому-то:

SELECT DISTINCT u FROM MyEntity u 
LEFT JOIN u.statusTypes statusTypes 
WHERE statusTypes in :statusTypes 

Я установил параметры запроса, как это:

query.setParameter("statusTypes", listOfStatusTypesEnums); 

Он будет выбрать строки, в которых по крайней мере один элемент из listOfStatusTypesEnums списка присутствует в statusTypes собственности предприятия (т.е. если 2 - это пересечения в некотором роде).

Если у вас есть обычный список объектов (которые не являются @ElementCollection, но @OneToMany и т. Д.), То это же правило будет работать. Просто используйте вот так: LEFT JOIN u.subEntities subEntities WHERE subEntities.id in :subEntityIds

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