Java 使用hibernate进行的查询更新遇到QueryException:无法解析路径
我有以下实体,需要更新特定字段中的字段,其removedDate为空。但是下面的代码返回异常Java 使用hibernate进行的查询更新遇到QueryException:无法解析路径,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我有以下实体,需要更新特定字段中的字段,其removedDate为空。但是下面的代码返回异常 @Entity public class Cart implements Serializable { @Id @GeneratedValue private Long id; @OneToMany(cascade = CascadeType.ALL) @LazyCollection(LazyCollectionOption.FALSE) privat
@Entity
public class Cart implements Serializable {
@Id
@GeneratedValue
private Long id;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List<CartItem> items;
public Cart() {
}
getters and setters
}
@Entity
public class CartItem {
@Id
@GeneratedValue
private long id;
@ManyToOne
private Product pro;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date addedDate;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date removedDate;
getters and setters
}
代码1的例外情况
休眠代码2
代码2的例外情况
试试看:
Query query = session.createQuery("UPDATE CartItem SET removedDate = :currentDateTime "
+ " WHERE id IN (Select ci.id From Cart c inner join c.items ci"
+ " WHERE c.id = :cartId"
+ " AND ci.pro.id = :pro"
+ " AND ci.removedDate is null)");
尝试在内部选择查询中添加别名
Query query = session.createQuery("UPDATE CartItem SET removedDate = :currentDateTime "
+ " WHERE id IN (Select cart.items.id From Cart cart"
+ " WHERE cart.id = :CartId"
+ " AND cart.items.pro.id = :pro"
+ " AND cart.items.removedDate is null)");
编辑2
我读了一些书,发现object.collection.id只适用于1:1或N:1关系,而不适用于1:N关系,这正是您所拥有的。试试这个
SELECT items.id
FROM Cart cart
LEFT JOIN cart.items items
WHERE cart.id = :CartId AND items.pro.id = :pro AND items.removedDate is null
还有更多,你为什么不把你的联系双向化呢? 将其添加到您的CartItem实体: 在购物车中指定的购物车项目上设置mappedBy:
感谢Hrishikesh的评论,我通过提供确切的SQLQuery找到了答案
UPDATE cartItem SET removedDate = :currentDateTime"
+ " WHERE pro = :pro"
+ " AND removedDate IS NULL"
+ " AND id IN
( SELECT items_id from Cart_CartItem WHERE Cart_id = :CartId)
@AlexCartio1能否尝试在中使用id而不是CartItem.id?@AlexCartio1在我花了一些时间在测试环境中设置hibernate后更新了答案。它返回org.hibernate.exception.genericjdbception:无法执行statement@AlexCartio1你在使用MySql吗?因为它不支持在更新和子查询中使用相同的表。如果没有,是否可以粘贴更多堆栈跟踪?请尝试在内部选择查询中添加别名。。Query Query=session.createQueryUPDATE CartItem SET removedDate=:currentDateTime+其中id从cart cart中选择cart.items.id=:CartId+和cart.items.pro.id=:pro+和cart.items.removedDate为空@Hrishikesh请您将其写在回答部分。我很抱歉会这样做。它会引发严重问题:org.hibernate.QueryException:非法尝试使用元素属性引用[id]取消引用集合[id.items],我将购物车更改为购物车,但相同的例外情况是,当我将括号中的查询复制到数据库管理器时,它会引发错误,当我将LEFT Join改为Join时,它可以工作,但使用hibernate两者都不能works@AlexCartio1使用SQLQuery而不是createQueryit返回org.hibernate.AnnotationException:mappedBy引用未知的目标实体PropertyId您对ManyTone属性车使用相同的名称,并在mappedBy属性?+1中使用相同的名称进行双向关联。这确实是“修复”此查询并简化结构以供将来使用的最佳方法。我们所有160多个OneToMany协会都使用mappedBy。
Query query = session.createQuery("UPDATE CartItem SET removedDate = :currentDateTime "
+ " WHERE id IN (Select ci.id From Cart c inner join c.items ci"
+ " WHERE c.id = :cartId"
+ " AND ci.pro.id = :pro"
+ " AND ci.removedDate is null)");
Query query = session.createQuery("UPDATE CartItem SET removedDate = :currentDateTime "
+ " WHERE id IN (Select cart.items.id From Cart cart"
+ " WHERE cart.id = :CartId"
+ " AND cart.items.pro.id = :pro"
+ " AND cart.items.removedDate is null)");
SELECT items.id
FROM Cart cart
LEFT JOIN cart.items items
WHERE cart.id = :CartId AND items.pro.id = :pro AND items.removedDate is null
@ManyToOne
private Cart cart;
@OneToMany(cascade = CascadeType.ALL, mappedBy="cart")
@LazyCollection(LazyCollectionOption.FALSE)
private List<CartItem> items;
"UPDATE CartItem c SET c.removedDate = :currentDateTime "
+ " WHERE c.cart.id = :cartId"
+ " AND c.pro.id = :pro"
+ " AND c.removedDate is null"
UPDATE cartItem SET removedDate = :currentDateTime"
+ " WHERE pro = :pro"
+ " AND removedDate IS NULL"
+ " AND id IN
( SELECT items_id from Cart_CartItem WHERE Cart_id = :CartId)