Java 使用hibernate进行的查询更新遇到QueryException:无法解析路径

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

我有以下实体,需要更新特定字段中的字段,其removedDate为空。但是下面的代码返回异常

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