【问题标题】:Using MEMBER OF with a collection of entities identified by a composite key将 MEMBER OF 与由复合键标识的实体集合一起使用
【发布时间】:2012-04-29 00:31:04
【问题描述】:

我正在尝试返回一组不属于这样的集合的对象:

    TypedQuery<Extra> q = em
            .createQuery(
                    "SELECT e FROM Extra e, Arrangement a WHERE "
                        + "a.id = :arrid AND e NOT MEMBER OF a.extras",
                    Extra.class);
    q.setParameter("arrid", a.getId());
    return q.getResultList();

但我得到了一个糟糕的 SQL:

Caused by: org.h2.jdbc.JdbcSQLException: Subquery is not a single column query; SQL statement:
select extra0_.code as code427_, extra0_.edition_number as edition5_427_,
extra0_.totalCost as totalCost427_, extra0_.unitCost as unitCost427_,
extra0_.units as units427_ from extra_arrangements extra0_
cross join arrangements arrangemen1_
where arrangemen1_.id=? and
((extra0_.code, extra0_.edition_number) not in
  (select extra3_.code, extra3_.edition_number
   from arrangements_extra_arrangements extras2_, extra_arrangements extra3_
   where arrangemen1_.id=extras2_.arrangements_id and
   extras2_.extras_code=extra3_.code and
   extras2_.extras_edition_number=extra3_.edition_number)) [90052-161]

问题是这个其他查询按预期工作:

    TypedQuery<Exhibitor> q = em.createQuery(
        "SELECT e FROM Exhibitor e, Edition ed WHERE ed.number = :ednum AND "
        + "e NOT MEMBER OF ed.exhibitors",
        Exhibitor.class);
    q.setParameter("ednum", e.getNumber());
    return q.getResultList();

唯一的区别是 Exhibitor 有一个单列 id,而 Extra 有一个复合键:

@Entity
@Table(name = "exhibitors")
public class Exhibitor implements Serializable, Comparable<Exhibitor> {

    @Id
    private int id;
    @Column(length = 100)
    private String code;
    @ManyToMany
    private List<Edition> edition;
    ...
}

额外:

@Entity
@Table(name="extra_arrangements")

public class Extra implements Serializable {

    @EmbeddedId
    private ExtraCode id;
    private double unitCost;
    private double units;
    ...
}


@Embeddable
public class ExtraCode implements Serializable {

    private String code;
    @ManyToOne
    private Edition edition;

    //Getters and setters omitted
}

知道我可能做错了什么以及如何解决吗?

【问题讨论】:

    标签: java jpa persistence jpql


    【解决方案1】:

    我觉得和this one的问题一样。
    H2 does not currently support that style of IN query.

    sql-query 中有问题的地方:

    和 ( ( extra0_.code, extra0_.edition_number ) 不在 (选择 ...) )

    【讨论】:

    • 这实际上是我的问题,使用mysql一切正常!
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2010-10-26
    • 2017-08-20
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多