Java Hibernate HQL更新,其中包含
我想通过在“where-in”子句中使用列表集合来更新状态。 参数“UserId”是一个对象UserId的列表,其中包含两个属性,如creationDate和ref 例如:Java Hibernate HQL更新,其中包含,java,hibernate,hql,Java,Hibernate,Hql,我想通过在“where-in”子句中使用列表集合来更新状态。 参数“UserId”是一个对象UserId的列表,其中包含两个属性,如creationDate和ref 例如: @Modifying @Query("update User u set u.status = ?2 where u.userid ?1") void updateAllUserStatus( List<UserId> usersId, UserStatus status); publi
@Modifying
@Query("update User u set u.status = ?2 where u.userid ?1")
void updateAllUserStatus( List<UserId> usersId, UserStatus status);
public class UserId implements Serializable {
@Type(type="date")
@Column(name = "creation_date")
private Date creationDate;
@Type(type = "string")
@Column(name = "user_ref")
private String ref;
}
修改
@查询(“更新用户u设置u.status=?2,其中u.userid?1”)
void updatealuserstatus(列出usersId、UserStatus状态);
公共类UserId实现了可序列化{
@类型(Type=“日期”)
@列(name=“创建日期”)
私人约会;
@类型(Type=“string”)
@列(name=“user\u ref”)
私有字符串引用;
}
是否可以使用具有对象的集合更新查询?
或者我应该一个一个地更新
我试过使用参数ListusersId(有两个属性:creation\u date和user\u ref),如下所示:
打印出的用户SID:
[创建日期:星期一2月24日00:00:00 CET 2020 |用户参考:
testabc-1234-1234-1234-abcdefghigk1,创建日期:周一至二月二十四日
00:00:00 CET 2020 |用户参考:testabc-1234-1234-1234-abcdefghigk2]
当我用userid所在的条件更新时,出现了这个错误
参数值元素[创建日期:星期一2月24日00:00:00 CET 2020|
用户_ref:testabc-1234-1234-1234-abcdefghigk1]与预期不匹配
类型[用户ID(不适用)];嵌套异常是
java.lang.IllegalArgumentException:参数值元素
[创建日期:星期一2月24日00:00:00 CET 2020 |用户参考:
testabc-1234-1234-1234-abcdefghigk1]与预期类型不匹配
[用户ID(不适用)]
我进行了调试,以验证列表是否正确填写并且没有问题。这是完全可能的,因为您的数据库支持行值构造函数语法,并将创建类似以下内容的SQL查询:
update User u set u.status = ? where (u.ref, u.creationDate) in ((?,?),(?,?))
克里斯蒂安·贝科夫注意到,这是可能的。我想补充以下引文: 在谓词中,
检查特定值是否在值列表中。其语法是:
in_expression ::= single_valued_expression [NOT] IN single_valued_list
single_valued_list ::= constructor_expression | (subquery) | collection_valued_input_parameter
constructor_expression ::= (expression[, expression]*)
单值表达式的类型和单值列表中的单个值必须一致
JPQL将此处的有效类型限制为字符串、数字、日期、时间、时间戳和枚举类型,并且在JPQL中,单值表达式
只能引用:
- “状态字段”,它是简单属性的术语。具体而言,这不包括关联和组件/嵌入属性
- 实体类型表达式
在HQL中,单值表达式
可以引用更广泛的表达式类型集。允许单值关联,组件/嵌入属性也是允许的,尽管该特性取决于对元组或底层数据库的支持级别。此外,HQL不会以任何方式限制值类型,尽管应用程序开发人员应该知道,基于底层数据库供应商的不同类型可能会导致有限的支持。这主要是JPQL限制的原因
因此,此功能的使用将把您与特定的jpa实现和数据库联系起来。我甚至不知道这里的原始SQL更新是什么。也许你应该告诉我们你想要什么样的SQL,然后我们可以退出,看看Hibernate/JPA是否可以处理它。@Tim Biegeleisen:我更新了更精确的答案。@Katy你使用什么数据库?我使用postgresql。我发现了我的问题,因为我使用tapestry,当我将对象作为上下文传递时,它会转换为字符串。这就是为什么我会有这个错误。通过使用这个hql,我会有这个错误。我用更多细节更新了我的问题。使用如下查询:updateuser u set u.status=?2其中u.userid在?1