我将 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
结合了 CREATE
和USE_DECLARED_QUERY
。首先它寻找声明的 @NamedQuery
基于指定的方法名称,如果未找到,则委托(delegate)动态创建一个新方法。
我想知道(我没有直接查看代码)异常是否作为逻辑的一部分被抛出、记录和捕获,以了解委托(delegate)给 CREATE
当 USE_DECLARED_QUERY
时的选项根据 Spring 数据使用的默认设置失败。
引入@Query
的原因注释解决了这个问题,因为它将策略行为更改为仅使用 CREATE
因此会生成一个值为 @Query
的命名查询.
关于java - 使用不带"No query defined for that name"的spring-data-jpa时出现"@Query"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42039726/