2017-02-04 1 views
0

私はhibernateとmysqlでspring-data-jpaを使用しています。"@Query"を指定せずにspring-data-jpaを使用すると、その名前に対して定義されたクエリがありません。

私は、次のエンティティ

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

これは、単にコードがクエリのルックアップ戦略のデフォルト設定を処理したり、おそらくあなたは@EnableJpaRepositories注釈で戦略を微調整してきた方法で春データモジュールにマイナーなバグかもしれません。

どちらの方法でも、ドキュメントには、とUSE_DECLARED_QUERYの両方を組み合わせたCREATE_IF_NOT_FOUNDというメッセージが記載されています。まず、指定されたメソッド名に基づいて宣言された@NamedQueryを探します。見つからなければ、代理人はその場で新しい名前を作成します。

は私がUSE_DECLARED_QUERYは、デフォルト設定の春のデータに基づいて、失敗したときにCREATEオプションに委譲するために知って例外がスローされた場合には、(私は直接コードを見ていない)ログイン、およびロジックの一部として捉え疑問使用する。

@Query注釈を導入する理由は、戦略の振る舞いをCREATEだけに変更し、@Queryの値で名前付きクエリが生成されるためです。

0

あなたはそれを生成するために、引数なしのコンストラクタを追加するか、Lombokのアノテーションを使用します。ロンボクが期待どおりに動いていることを確認し、STSで動作させるために問題が発生しました。

関連する問題