我正在使用带有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”注释会出现异常?
答案 0 :(得分:1)
您可能希望添加no args构造函数或使用Lombok的注释,以便它为您生成一个。确保Lombok按预期工作,我遇到了问题,试图让它与STS一起工作。
答案 1 :(得分:0)
这可能只是Spring数据模块中的一个小错误,代码如何处理查询查询策略的默认设置,或者您可能已经调整了{{1}中的策略注释。
无论哪种方式,文档都说默认为@EnableJpaRepositories
,它结合了CREATE_IF_NOT_FOUND
和CREATE
。首先,它根据指定的方法名称查找声明的USE_DECLARED_QUERY
,如果没有找到,则委托创建一个新的动态。
我想知道(我没有直接查看代码)如果异常被抛出,记录并作为逻辑的一部分被捕获,以便在@NamedQuery
时委托给CREATE
选项}基于Spring数据使用的默认设置失败。
引入USE_DECLARED_QUERY
注释的原因解决了这个原因是因为这会将策略行为改为仅使用@Query
,因此生成的值为CREATE
的命名查询。