繁体   English   中英

在JPA中联接2个表的CreateQuery

[英]CreateQuery joining 2 tables in JPA

我有这个错误

The collection-valued path 'c.medecin' cannot be resolved to a valid association field
The state field path 'm.id' cannot be resolved to a valid type.

当我执行此请求时

createQuery("select c from Creneaux c join c.medecin m where m.id=:idMedecin").setParameter("idMedecin", medecin.getId());

我使用以下两个表:MEDECINS(ID)和CRENEAUX(ID,ID_MEDECIN)

@Entity
@Table(name = "medecins")
@XmlRootElement
public class Medecins implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "medecin"/*"idMedecin"*/)
    private transient List<Creneaux> creneauxList;
}

@Entity
@Table(name = "creneaux")
public class Creneaux implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ID_MEDECIN")
    private transient Medecins medecin;

    @Column(name = "ID_MEDECIN")
    private BigInteger idMedecin;

我从JPA开始,所以我不确定所有代码。 我认为查询是正确的,但是我不知道如何注释实体以使查询有效。 谢谢

我想知道为什么要在第二个实体中添加最后一个属性: idMedecin而您已经将两个实体彼此连接了。 也许你应该忽略它。 如果查询的目的是选择与给定的医学相关的所有克里尼奥酒,那么您应该将查询更改为:

createQuery("SELECT c FROM Creneaux c WHERE c.medecin.id = :idMedecin").setParameter("idMedecin", medecin.getId());

执行查询之前应在何处提供medecin.getId()

这是因为Creneaux.medecin字段是transient JPA将忽略瞬态字段。

另一件事是这两个实体没有两个联接。 如果要按Medecin ID进行过滤,则足以执行@Omar描述的查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM