【问题标题】:Error executing EntityManageer delete native query with in clause parameter使用 in 子句参数执行 EntityManager 删除本机查询时出错
【发布时间】:2013-10-13 00:50:10
【问题描述】:

使用 in 子句参数执行 EntityManager 删除本机查询时出错。参数是 List 类型,我想做一些类似的事情-

List<UUID> ids = ...
entityManager.createNativeQuery("DELETE FROM FOO WHERE ID IN (:ids)")
        .setParameter("ids", ids)
        .executeUpdate();

我得到的例外是-

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: ERROR: IN could not convert type bytea to uuid
  Position: 39
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1377)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1387)
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:108)
[snip]

请告诉我如何运行上面的删除查询。

【问题讨论】:

    标签: java hibernate persistence


    【解决方案1】:

    由于它是本机查询,您应该有如下内容:entityManager.createNativeQuery("DELETE FROM FOO WHERE ID IN (?1)") .setParameter(1, ids) .executeUpdate();

    另外,我认为在这种情况下您不需要本机查询,下面的代码也应该可以工作:

    entityManager.createQuery("DELETE FROM FOO WHERE ID IN (:ids)")
        .setParameter("ids", ids)
        .executeUpdate();
    

    【讨论】:

    • 在 Native 查询中确保它是 FOO 的 SQL 表名。
    • 我认为我得到的错误是特定于 postgres 和休眠的。我稍后会尝试更新问题。
    猜你喜欢
    • 2017-05-24
    • 2018-07-07
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多