CreateQuery在JPA中连接2个表

时间:2013-11-24 21:52:43

标签: java jpa join

我有这个错误

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开始,所以我不确定所有的代码。我认为查询是正确的,但我不知道如何注释实体以使查询有效。 感谢

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

那是因为Creneaux.medecin字段是transient。 JPA会忽略瞬态字段。

另一件事是你没有两个加入这两个实体。如果你想用Medecin ID过滤它就足以执行@Omar描述的查询。