2014-02-07 1 views
2

У меня есть интерфейс, который расширяет CrudRepository и реализует метод с @Query аннотация с атрибутом nativeQuery настроен на true. Этот метод возвращает список объекта.Spring Data JPA - Исходный запрос на репозитории crud работает с объединениями?

Пример:

public interface MessageTemplateRepository extends CrudRepository<MessageTemplate, Integer> { 
    @Query(nativeQuery = true, "select template.* from plan_granted_template granted join license license on granted.fk_plan = license.fk_plan join message_template template on granted.fk_message_template = template.id where license.fk_garage = ?2 and template.message_type = ?1") 
    public List<MessageTemplate> findGrantedTemplatesByMessageTypeAndGarage(MessageType messageType, Garage garage); 
} 

Гараж имеет один Лицензия
Лицензия имеет один план и гараж
План имеет много MessageTemplate

Класс лицензии имеет ManyToOne отношения с планом и Отношение OneToOne к гаражу
(таблица лицензии - столбцы fk_plan и fk_garage)

План класс имеет ManyToMany отношения с MessageTemplate
(таблица plan_granted_template - столбцы fk_plan и fk_message_template)

Класс MessageTemplate имеет atribute MessageType
(таблица message_template - столбец message_type)

Этот метод должен вернуть весь объект MessageTemplate, найденный в запросе, но всегда возвращает пустой список. Выполнение этого запроса в mysql возвращает правильный результат. Также, глядя на журналы Hibernate, запрос выполняется с правильными параметрами, но в любом случае возвращается пустой список.

Я думаю, что Spring выполняет запрос, но он не может преобразовать resultSet в экземпляр MessageTemplate.

+0

Почему вы не используете JPQL вместо этого native, у вас есть ваши объекты, сопоставленные? – Koitoer

+0

Да, у меня есть отображаемые объекты. У меня есть dificulties с jpql, но этот запрос, выполненный в mysql, возвращает результат правильно = ( –

+0

Не уверен, что ваши параметры MessageTemplate messageTemplate воспроизводит weel с template.message_type =? 1, вы пытались передать String messageTemplate, я имею в виду преобразование между messageTemplate и String, необходимые в запросе, попробуйте добавить DEBUG, чтобы увидеть, как параметры отправляются в базу данных. – Koitoer

ответ

1

Вам необходимо передать параметры как String и Integer. Hibernate регистрирует этот путь в обоих случаях: [BasicBinder: 83]: параметр привязки [1] как [INTEGER] - 1 [BasicBinder: 83]: параметр привязки [2] как [VARCHAR] - ДОБРО ПОЖАЛОВАТЬ.

Не уверен, что ваши параметры MessageTemplate messageTemplate хорошо работает с template.message_type =? 1, вы пытались передать String messageTemplate, я имею в виду преобразование между тегами messageTemplate и String, необходимыми в запросе, попробуйте добавить DEBUG, чтобы увидеть параметры отправьте сообщение

UPDATE И конечные параметры в методе должны быть строковыми и int, а не классами.