2017-02-04 5 views
0

Я использую spring-data-jpa с hibernate и mysql.Исключение исключение «Нет запроса определено для этого имени» при использовании spring-data-jpa без «@Query»

У меня есть следующий Entity

package com.wayne.domain.player; 
@Entity 
@Table(name = "PLAYER") 
@Getter 
@Setter 
@ToString 
public class Player { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", nullable = false) 
    private Long id; 

    @Column(name = "EMAIL") 
    private String email; 

    // ... 
} 

и хранилище:

@Repository 
public interface PlayerRepository extends JpaRepository<Player, Long> { 
    List<Player> findByEmail(String email); 
} 

, когда я построить и запустить проект, я получаю следующее сообщение об ошибке:

java.lang.IllegalArgumentException: No query defined for that name [Player.findByEmail] 

но Метод findByEmail работает нормально.

Если я изменить метод с «@Query» аннотацию, как это:

@Repository 
public interface PlayerRepository extends JpaRepository<Player, Long> { 
    @Query("select p from Player p where p.email = ?1") 
    List<Player> findByEmail(String email); 
} 

не является исключением, и метод findByEmail работает отлично.

Я знаю, что spring-data-jpa автоматически создает запросы от имен методов. Но почему существует исключение без аннотации @Query?

+0

Возможно, 'findByEMAIL'? – luk2302

ответ

0

Это может быть просто незначительная ошибка в модуле данных Spring с тем, как код обрабатывает настройки по умолчанию для запросов Lookup стратегии или, возможно, вы подправили стратегию в @EnableJpaRepositories аннотацию.

В любом случае в документации указано, что по умолчанию CREATE_IF_NOT_FOUND, который сочетает в себе как CREATE, так и USE_DECLARED_QUERY. Сначала он ищет объявленный @NamedQuery на основе указанного имени метода, а если не найден, делегаты создают новый «на лету».

Мне интересно (я не смотрел код напрямую), если исключение выбрано, зарегистрировано и поймано как часть логики, чтобы знать, чтобы делегировать значение CREATE, когда USE_DECLARED_QUERY не удалось выполнить настройку по умолчанию. Данные Spring использует.

Причина, связанная с аннотацией @Query, заключается в том, что это изменяет поведение стратегии только для использования CREATE, и поэтому именованный запрос генерируется со значением @Query.

0

Возможно, вы захотите добавить конструктор no args или использовать аннотацию для Lombok, чтобы он генерировал один для вас. Убедитесь, что Lombok работает так, как ожидалось, у меня были проблемы с ним, пытаясь заставить его работать с STS.

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