我正在使用Hibernate学习JPA,也使用maven.我的问题是如何在命名查询中使用带有UPDATE和SET子句的输入参数?
@NamedQuery(name = "updateEmailAddress", query = "Update User u set u.email = :email where u.username = :username")
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误,即参数只能在WHERE或HAVING子句中使用.我提到了几篇文章,但仍然找不到合适的解决方案.
在JPA 2.0及更低版本中,命名查询的set子句中不允许使用参数; 只有文字.如果您使用的是JPA 2.1,则会解除此限制.
从我可以收集到的,你没有使用JPA 2.1.因此,我会给你几种方法来回避这个限制.
选项1:使用createQuery方法并将动态生成的字符串传递给方法.
String queryString = generateQueryString(email, username);
entityManager.createQuery(queryString).executeUpdate();
Run Code Online (Sandbox Code Playgroud)
选项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);
}
Run Code Online (Sandbox Code Playgroud)
选项3:使用HQL而不是JPQL创建查询.我没有测试过这个,也没有推荐它,因为你是在实体经理的背后.
Query q = sessionFactory.getCurrentSession().createNamedQuery('updateEmailAddress');
q.setParameter('email', email);
q.setParameter('username', username);
q.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16577 次 |
| 最近记录: |