【问题标题】:JPQL query with ManyToMany [duplicate]使用多对多的 JPQL 查询 [重复]
【发布时间】:2016-03-16 16:18:00
【问题描述】:

我正在尝试按照 JPQL 执行此操作:

@Query("select o from Offre o where o.typeContrat.titre=:a or o.ville.nomVille=:b or o.competences.libelleCompetance = :c")
    public Page<Offre> offresSearch(@Param("a") String type, @Param("b") String location, @Param("c") String competence,Pageable pageable);

这是我的Offre实体:

@Entity
public class Offre implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "CODE_OFFRE")
    private Long codeOffre;
    private String titre;
    @Lob
    private String description;
    @ManyToOne
    @JoinColumn(name="codeContratType")
    private TypeContrat typeContrat;

    @ManyToMany
    @JoinTable(name="OFFRE_COMP",
            joinColumns=@JoinColumn(name="CODE_OFFRE"),
            inverseJoinColumns=@JoinColumn(name="CODE_COMPETENCE"))
    private List<Competence> competences;

    // Getters and setters

这是我的能力实体:

    @Entity
    public class Competence implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "CODE_COMPETENCE")
    private Long codeCompetence;
    private String libelleCompetance;

    @ManyToMany(mappedBy="competences")
    private Collection<Offre> offres;

    // Getters, Setters

    @JsonIgnore
    @XmlTransient
    public Collection<Offre> getOffres() {
        return offres;
    }
    @JsonSetter
    public void setOffres(Collection<Offre> offres) {
        this.offres = offres;
    }
}

但是当我运行我的应用程序时,我收到了这个错误:

java.lang.IllegalArgumentException: org.hibernate.QueryException: 非法尝试取消引用集合 [offre0_.code_offre.competences] 带有元素属性参考 [libelleCompetance] [从 com.capValue.Rekrute.entities.Offre 中选择 o o 其中 o.typeContrat.titre=:a 或 o.ville.nomVille=:b 或 o.competences.libelleCompetance = :c] 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750) ...

【问题讨论】:

  • 您可能需要显式加入而不是向下钻取参考。

标签: java jpa


【解决方案1】:

您无法在 ToMany 关系的查询中导航。您必须使用 JOIN:

select o from Offre o join o.competences c 
where o.typeContrat.titre = :a or o.ville.nomVille = :b or c.libelleCompetance = :c

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 2013-09-06
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2011-07-29
    • 2012-06-08
    相关资源
    最近更新 更多