gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:55:53 25 4
gpt4 key购买 nike

我将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com