Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate HQL更新,其中包含_Java_Hibernate_Hql - Fatal编程技术网

Java Hibernate HQL更新,其中包含

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

我想通过在“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);



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