使用没有“@Query”的spring-data-jpa时,“没有为该名称定义查询”异常

时间:2017-02-04 11:18:32

标签: java spring hibernate spring-data-jpa

我正在使用带有hibernate和mysql的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”注释会出现异常?

2 个答案:

答案 0 :(得分:1)

您可能希望添加no args构造函数或使用Lombok的注释,以便它为您生成一个。确保Lombok按预期工作,我遇到了问题,试图让它与STS一起工作。

答案 1 :(得分:0)

这可能只是Spring数据模块中的一个小错误,代码如何处理查询查询策略的默认设置,或者您可能已经调整了{{1}中的策略注释。

无论哪种方式,文档都说默认为@EnableJpaRepositories,它结合了CREATE_IF_NOT_FOUNDCREATE。首先,它根据指定的方法名称查找声明的USE_DECLARED_QUERY,如果没有找到,则委托创建一个新的动态。

我想知道(我没有直接查看代码)如果异常被抛出,记录并作为逻辑的一部分被捕获,以便在@NamedQuery时委托给CREATE选项}基于Spring数据使用的默认设置失败。

引入USE_DECLARED_QUERY注释的原因解决了这个原因是因为这会将策略行为改为仅使用@Query,因此生成的值为CREATE的命名查询。