【问题标题】:Java repository - Spring Data JPAJava 存储库 - Spring Data JPA
【发布时间】:2017-05-22 23:23:37
【问题描述】:

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

用户存储库

@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,我已经使用这个框架开发了一些小项目,并且我使用了正常的方法没有任何问题。我已阅读文档试图找到对此的解释,但我没有找到任何解释。

  • 谁能向我解释为什么我的第一次尝试没有成功?

【问题讨论】:

  • 你的 User 类是什么样子的?
  • 我已经编辑了我的主要帖子。
  • 假设 JPA Query 方法与 POJO User 相关。查看documentation了解更多详情。
  • 我在实体中也有这个:@NamedQuery(name = "User.findByEmail", query = "SELECT u FROM User u WHERE u.email = :email")

标签: java spring spring-boot repository spring-data-jpa


【解决方案1】:

请看以下jira票DATAJPA-733

来自奥利弗·吉尔克

如果您使用 Java 8 并启用了 -parameters 进行编译,或者在参考文档中记录的查询方法参数上使用 @Param 注释,则只能在查询中使用命名参数。 需要注解的原因是在 Java 8 之前没有办法在接口方法的代码中保留变量名。

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

【讨论】:

  • 我正在使用 Java 8。我将尝试删除命名查询。
  • 但这并不意味着您使用 java 8 并启用了 -parameters 进行编译
  • 它在没有命名查询的情况下工作。如此棘手的解决方法我永远猜不到。先生给你满分。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 2016-12-26
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 2018-10-06
  • 2018-06-15
  • 1970-01-01
相关资源
最近更新 更多