java - 使用不带"No query defined for that name"的spring-data-jpa时出现"@Query"异常

标签 java spring hibernate spring-data-jpa

我将 spring-data-jpa 与 hibernate 和 mysql 一起使用。

我有以下实体

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);
}

没有异常(exception),findByEmail方法工作正常。

我知道 spring-data-jpa 自动从方法名称创建查询。 但是为什么没有“@Query”注解会出现异常呢?

最佳答案

这可能只是 Spring Data 模块中的一个小错误,涉及代码如何处理查询查找策略的默认设置,或者您可能已经在 @EnableJpaRepositories 中调整了策略。注释。

无论哪种方式,文档都说默认值为 CREATE_IF_NOT_FOUND结合了 CREATEUSE_DECLARED_QUERY 。首先它寻找声明的 @NamedQuery基于指定的方法名称,如果未找到,则委托(delegate)动态创建一个新方法。

我想知道(我没有直接查看代码)异常是否作为逻辑的一部分被抛出、记录和捕获,以了解委托(delegate)给 CREATEUSE_DECLARED_QUERY 时的选项根据 Spring 数据使用的默认设置失败。

引入@Query的原因注释解决了这个问题,因为它将策略行为更改为仅使用 CREATE因此会生成一个值为 @Query 的命名查询.

关于java - 使用不带"No query defined for that name"的spring-data-jpa时出现"@Query"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42039726/

相关文章:

java - 如何将 servlet api 添加到我的 pom.xml

Java套接字发送数据

java - Spring @DependsOn 注释是否有 "revert"?

spring - @Transactional(rollbackFor = Exception.class) 和@Transactional(propagation=Propagation.REQUIRED) 之间有什么区别

hibernate - AbstractTransactionalJUnit4SpringContextTests

java - 使用 jQplot 实现图表

JAVA - ScheduledExecutorService 不退出线程

spring - 如何使用 Spring Security 显示隐藏元素

java - Spring 网 react 无法表现出背压

java - Guice:如何为一种类型获取多个@Provides?