2015-10-07 2 views
2

Я хотел протестировать запрос с присоединением атрибута Map для одной конкретной записи MapKey, и я еще не смог найти решение. Кто-нибудь когда-либо выполнял такой запрос и мог использовать правильный JPQL/HQL?JPA/Hibernate: Можете ли вы создать запрос соединения для конкретного MapKey?

Столбец MapKey имеет тип enum, а значение равно @Entity.

Это модель:

@Entity 
public class Operation { 

    @Id 
    private int id; 

    @OneToMany(mappedBy = "operation", fetch = FetchType.LAZY) 
    @Cascade(CascadeType.ALL) 
    @MapKeyEnumerated(EnumType.STRING) 
    private Map<OperationDetailsType, OperationDetails> operationDetails; 
} 

@Entity 
public class OperationDetails { 

    @Id 
    private int id; 

    private String details; 

} 

public enum OperationDetailsType { SHORT, FULL } 

Это запрос, я в настоящее время пытался:

SELECT operation FROM Operation operation join operation.operationDetails['SHORT'] operationDetailsShort WHERE operationDetailsShort.details = :el1 

Я нашел эту ссылку в спящем сообществе, но подход с [...] вызывает ошибку : https://forum.hibernate.org/viewtopic.php?f=1&t=1004884

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: [ near line 1,... 

Hibernate версии: 4.3.8.Final

Благодаря

ответ

2

После изменения подхода поиска в сети я, наконец, нашел рабочий раствор.

Суть заключается в использовании запроса JOIN ... ON key().

Вот синтаксис запроса, чтобы получить этот ход JPA запроса:

SELECT operation FROM Operation operation 
    JOIN operation.operationDetails operationDetailsShort ON key(operationDetailsShort) = 'SHORT' 
    WHERE operationDetailsShort.details = :el1 

Хорошей вещи об этой конструкции является то, что вы можете создавать запросы к как OperationDetails для конкретного details: (Не говоря, что это производительное решение)

SELECT operation FROM Operation operation 
    JOIN operation.operationDetails operationDetailsShort ON key(operationDetailsShort) = 'SHORT' 
    JOIN operation.operationDetails operationDetailsLong ON key(operationDetailsFull) = 'FULL' 
    WHERE operationDetailsShort.details = :el1 
    AND operationDetailsFull.details = :el2 

EDIT: Как было упомянуто Влад Михалча, то JPQL эквивалент hibernaes JOIN ... WITH является JOIN ... ON. Я могу подтвердить, что это сработало и обновило запросы.

+1

Одно наблюдение только. WITH является ключевым словом HQL. Эквивалент JPQL включен, что приводит к условию ON JOIN в результирующем SQL. –

+0

Спасибо за информацию. Я попробую его и обновить ответ, если это тоже работает –

+0

Добро пожаловать. ON был добавлен в [JPA 2.1] (http://www.thoughts-on-java.org/jpa-21-overview/), поэтому стоит также упомянуть об этом. –

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

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