繁体   English   中英

Java存储库-Spring Data JPA

[英]Java repository - Spring Data JPA

我在春季做一个虚拟项目,以记住旧技能。 我已经实现了以下存储库。

用户存储库

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    User findByUuid(String uuid);

    User findByEmail(String email);

    @Override
    List<User> findAll();
}

带有getter和setter的用户实体 ,为清楚起见已删除

@NamedQueries({
    @NamedQuery(name = "User.findByEmail", query = "SELECT u FROM User u WHERE u.email = :email")})
public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(nullable = false)
    private Long id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 64)
    @Column(nullable = false, length = 64)
    private String uuid;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 128)
    @Column(nullable = false, length = 128)
    private String username;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 128)
    @Column(nullable = false, length = 128)
    private String email;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 64)
    @Column(nullable = false, length = 64)
    private String password;
}

运行项目并使用查询findByEmail后,出现以下错误:

java.lang.IllegalArgumentException:该位置为[1]的参数不存在

因此,我已经为我的问题搜索了一些可能的解决方案,并实际上找到了一个。 将查询替换为:

User findByEmail(@Param("email") String email);

这不是我第一次尝试Spring,而是使用此框架开发了一些小型项目,并且我使用正常方法也没有任何问题。 我已经阅读了文档,试图找到对此的解释,但是我没有找到任何解释。

  • 有人可以向我解释为什么我的第一次尝试没有成功吗?

请参阅以下吉拉DATAJPA-733

从奥利弗·吉尔克(Oliver Gierke)

仅当您使用启用了-parameters的Java 8进行编译,或者在参考方法文档中对查询方法参数使用@Param批注时,才可以在查询中使用命名参数。 进行必需注释的原因是,在Java 8之前,无法将变量名称保留在接口方法的代码中。

提供的解决方法是删除命名查询

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM