【问题标题】:How to delete items by ID-s of their child item in Hibernate?如何通过 Hibernate 中子项的 ID-s 删除项?
【发布时间】:2012-12-06 22:17:26
【问题描述】:

我正在尝试编写一个 JPQL 查询,该查询将删除所有由ArtContent ID 引用特定 ArtContent-s 的 PlaylistItem-s。

我试过了:

public int deleteItemsByContentIds(Long[] contentIds) {
    EntityManager em = getEntityManager();
    int result = em.createQuery(
    "delete from PlaylistItem where artContent.id in (:idsArray) ")
    .setParameter("idsArray", contentIds).executeUpdate();

    return result;
}

但它会引发异常:

Servlet.service() for servlet RemoveContentServlet threw exception: 
javax.ejb.EJBException: java.lang.IllegalArgumentException: 
Encountered array-valued parameter binding, but was expecting [java.lang.Long]

什么是可以理解的,因为没有setParameter 方法将数组作为参数。那么解决此类问题的最佳方法是什么?

简化的类定义:

@Entity
public class PlaylistItem implements Serializable {

@Id
@GeneratedValue
private Long id;

private int position;

@ManyToOne(optional = false)
@JoinColumn(name = "PLAYLIST_ID")
private Playlist playlist;

@ManyToOne(optional = false)
@JoinColumn(name = "ART_CONTENT_ID")
private ArtContent artContent;

...

}

@Entity
public class ArtContent implements Serializable {

@Id
@GeneratedValue
private Long id;
...
}

【问题讨论】:

    标签: hibernate jpa jpql


    【解决方案1】:

    您可以继续使用.setParameter,但您需要使值扩展集合(如 ArrayList),而不是使用数组类型。也许只是改为:

    public int deleteItemsByContentIds(Long[] contentIds) {
        EntityManager em = getEntityManager();
        int result = em.createQuery(
        "delete from PlaylistItem where artContent.id in (:idsArray) ")
        .setParameter("idsArray", Arrays.asList(contentIds)).executeUpdate();
    
        return result;
    }
    

    【讨论】:

      【解决方案2】:

      改用setParameterList

      编辑:

      抱歉,JPA 将其转换为 Collection (Arrays.asList(arrayOfLongs)) 并使用 setParameter

      编辑 2:被打败了!

      【讨论】:

      • 谢谢,但是 setParameterList 是 org.hibernate.Query 的一种方法,这里我有 javax.persistence.Query。
      • 是的,Collection 做到了 :)
      猜你喜欢
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多