【问题标题】:Update/delete queries cannot be typed JPA更新/删除查询不能输入 JPA
【发布时间】:2015-04-10 22:13:47
【问题描述】:

我正在使用 Spring 框架来处理培训项目。我也在使用 JPA,并且一直在玩地狱。在我的 DAO 实现类中,我写过:

@Override
public void deleteEntries(Module mod) {
    System.out.println(mod.getDescription());
    entityManager.createQuery("delete from TrainingEntry e where e.module = :mod and e.completedDate IS NULL",
                              TrainingEntry.class).setParameter("mod", mod);

}

如您所见,这只是一个简单的 DELETE 语句,但我得到了错误:

"Update/delete queries cannot be typed."

我的猜测是,我需要使用一些 EntityManager 类方法来完成这项工作,但我不确定,因为网上几乎没有关于此错误的信息。我也很难应用一些我在网上找到的关于 JPA 删除查询的解决方案。任何正确方向的观点或关于为什么抛出此错误的解释都非常感谢。

【问题讨论】:

    标签: java spring jpa entitymanager sql-delete


    【解决方案1】:
    entityManager.createQuery("delete from TrainingEntry e where e.module = :mod and e.completedDate IS NULL").setParameter("mod", mod);
    

    【讨论】:

    【解决方案2】:

    EntityManager 方法的声明如下:

    Query createQuery(java.lang.String qlString)
    <T> TypedQuery<T> createQuery(java.lang.String qlString, java.lang.Class<T> resultClass)
    // The other three method is not relevant here
    

    由此,您可以清楚地看到,由于第二个参数,您得到了TypedQuery&lt;T&gt;。如果你删除它,你会得到一个简单的Query 对象。这就是你所需要的。

    【讨论】:

    • 感谢您的解释。将其标记为已回答,因为它消除了错误。仍然不喜欢我的查询,但至少取得了进展。
    【解决方案3】:

    在调用 createQuery() 时尝试删除 TrainingEntry.class 参数,因为这是使其成为“类型化”查询的原因。

    【讨论】:

    • 嗨大卫,我们通常输入的第二个参数(ClassName.class)表示什么?
    • @AshutoshTiwari 这是返回对象的类型。但由于更新和删除查询不返回行对象,因此不应包含这些对象。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2012-07-05
    • 2019-02-11
    • 2017-02-25
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多