带输入参数的命名查询

WC *_*ini 6 jpa named-query

我正在使用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子句中使用.我提到了几篇文章,但仍然找不到合适的解决方案.

Xav*_*ond 7

在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)