gpt4 book ai didi

jpa - 带输入参数的命名查询

转载 作者:行者123 更新时间:2023-12-03 01:13:17 25 4
gpt4 key购买 nike

我正在使用 Hibernate 学习 JPA,也使用 Maven。我的问题是如何在命名查询中将输入参数与 UPDATE 和 SET 子句一起使用?

 @NamedQuery(name = "updateEmailAddress", query = "Update User u set u.email = :email where u.username = :username")

它给我一个错误,参数只能在 WHERE 或 HAVING 子句中使用。我引用了几篇文章,但仍然找不到正确的解决方案。

最佳答案

在 JPA 2.0 及更低版本中,命名查询的 set 子句中不允许使用参数;只有文字。如果您使用 JPA 2.1,则可以解除此限制。

据我所知,您没有使用 JPA 2.1。因此,我将向您提供几种方法来规避此限制。

选项 1:使用 createQuery 方法并将动态生成的字符串传递给该方法。

    String queryString = generateQueryString(email, username);
entityManager.createQuery(queryString).executeUpdate();

选项 2:更新关联实体并合并。

    List<User> result = entityManager.createQuery('select u from user u where 
u.username = :username').setParameter('username', username).getResultList();
for (User user : result) {
user.setEmail(email);
entityManager.merge(user);
}

选项 3:使用 HQL 而不是 JPQL 创建查询。我没有测试过这个,也不推荐它,因为你是在实体经理的背后。

    Query q = sessionFactory.getCurrentSession().createNamedQuery('updateEmailAddress');
q.setParameter('email', email);
q.setParameter('username', username);
q.executeUpdate();

关于jpa - 带输入参数的命名查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40169175/

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