JPA多对多选择

时间:2014-12-10 14:22:41

标签: java jpa

我有两个实体FoaParamEmploye和FoaParamPosition(表FOA_PARAM_EMPLOYE和FOA_PARAM_POSITION)和ManyToMany注释(我没有把所有属性放在这里):

@Entity
@Table(name = "FOA_PARAM_EMPLOYE")
@NamedQuery(name = "FoaParamEmploye.findAll", query = "SELECT f FROM FoaParamEmploye f")
public class FoaParamEmploye implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private FoaParamEmployePK id;

    @ManyToMany
    @JoinTable(
        name = "FOA_PARAM_EMPLOYE_POSITION", 
        joinColumns = { @JoinColumn(name = "ID_EMPLOYE"), 
                        @JoinColumn(name = "COD_ENTREP") }
)
    private List<FoaParamPosition> foaParamPositions;
}

第二个:

@Entity
@Table(name="FOA_PARAM_POSITION")
@NamedQuery(name="FoaParamPosition.findAll", query="SELECT f FROM FoaParamPosition f")
public class FoaParamPosition implements Serializable {

    @EmbeddedId
    private FoaParamPositionPK id;

    @ManyToMany
    @JoinTable(
        name = "FOA_PARAM_EMPLOYE_POSITION", 
        joinColumns = { @JoinColumn(name = "ID_POSITION"),
                        @JoinColumn(name = "COD_ENTREP") }
    )
    private List<FoaParamEmploye> foaParamEmployes;
}

关联表格为FOA_PARAM_EMPLOYE_POSITION,其中包含COD_ENTREPID_POSITIONID_EMPLOYE字段。

PK是:

@Embeddable
public class FoaParamEmployePK implements Serializable {
    //default serial version id, required for serializable classes.
     private static final long serialVersionUID = 1L;

     @Column(name="COD_ENTREP")
    private String codEntrep;

    @Column(name="ID_EMPLOYE")
    private long idEmploye;
}

@Embeddable
public class FoaParamPositionPK implements Serializable {
    //default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;

    @Column(name="COD_ENTREP")
    private String codEntrep;

    @Column(name="ID_POSITION")
    private long idPosition;
}

我尝试为FoaParamEmploye获取所有FoaParamPosition。我写了这个JPQL查询:

Query q = entityMgr.createQuery(
    "SELECT position FROM FoaParamPosition position 
     INNER JOIN position.foaParamEmployes employes 
     where 
     employes.id.idEmploye = :idEmploye AND 
     employes.id.codEntrep =:codEntrep")
.setParameter("idEmploye", pIdEmploye)
.setParameter("codEntrep", "ENT");

我有一个例外:

ORA-00904: "FOAPARAMEM1_"."FOAPARAMEMPLOYES_ID_EMPLOYE" : non valid identifier

如您所见,生成SQL具有此属性,但我无法理解原因:

select
    foaparampo0_.COD_ENTREP as COD1_2337_,
    foaparampo0_.ID_POSITION as ID2_2337_,
    foaparampo0_.ACTEUR_MAJ_OCCUR as ACTEUR3_2337_,
    foaparampo0_.CD_PROFIL_AFFECTATION as CD4_2337_,
    foaparampo0_.CD_TYPE_PROFIL_POSITION as CD5_2337_,
    foaparampo0_.DATE_HEURE_MAJ_OCCUR as DATE6_2337_,
    foaparampo0_.DT_FIN_ACTIVITE_POSITION as DT7_2337_,
    foaparampo0_.HIERARCHIE_POSITION as HIERARCHIE8_2337_,
    foaparampo0_.ID_DIVISION_AGENCE as ID9_2337_,
    foaparampo0_.ID_EMPLOYE_PRINCIPAL as ID10_2337_,
    foaparampo0_.ID_REF_EXT_POSITION_PARENTE as ID11_2337_,
    foaparampo0_.ID_REF_EXTERNE_POSITION as ID12_2337_,
    foaparampo0_.NIVEAU_AGENCE as NIVEAU13_2337_,
    foaparampo0_.REF_EXT_POSITION as REF14_2337_,
    foaparampo0_.xqcif as xqcif2337_ 
from
    FOA_PARAM_POSITION foaparampo0_,
    FOA_PARAM_EMPLOYE_POSITION foaparamem1_,
    FOA_PARAM_EMPLOYE foaparamem2_ 
where
    foaparampo0_.COD_ENTREP=foaparamem1_.ID_POSITION 
    and foaparampo0_.ID_POSITION=foaparamem1_.COD_ENTREP 
    and foaparamem1_.foaParamEmployes_COD_ENTREP=foaparamem2_.COD_ENTREP 
    and foaparamem1_.foaParamEmployes_ID_EMPLOYE=foaparamem2_.ID_EMPLOYE 
    and foaparamem2_.ID_EMPLOYE=? 
    and foaparamem2_.COD_ENTREP=?

3 个答案:

答案 0 :(得分:0)

我建议您使用某些工具映射您的课程,例如Netbeans - &gt;生成JPA实体。 你的一方必须拥有一方(JoinColumn),一方必须是反方(mappedBy)。

如果您不想使用任何地图绘制工具,请参阅:

http://alextretyakov.blogspot.cz/2013/07/jpa-many-to-many-mappings.html

答案 1 :(得分:0)

我不确定,但我想如果首先通过 JPA 查询获得 FoaParamEmploye 对象,之后使用 getFoaParamPosition 方法此对象检索您的问题将得到解决的位置列表(在多对多关联中使用此方法时,JPA将自动检索列表):

Select distinct f from FoaParamEmployes f 
 where f.employes.idEmploye = :idEmploye

答案 2 :(得分:0)

我没有在您的地图中看到问题。您收到的错误明确抱怨无效的列名称。在Oracle中,引用的名称(如"FOAPARAMPO0_"."FOAPARAMPOSITIONS_ID_POSITION")区分大小写,而生成的列为foaParamPositions_COD_ENTREPfoaParamPositions_ID_POSITION且大小写不匹配会导致您的错误。

快速检查将大写 foaParamEmployes foaParamPositions ,如果我是对的,则应解决上述问题。如果是这样,您可以使用更优雅的方法来控制使用映射生成的名称。

我在注释中注意到你的其他问题,指的是 inverseJoinColumns 的问题。这就是为什么我提到你的房产上层。但事实上,你可以使用像

这样的映射来处理它
@ManyToMany
@JoinTable(
    name = "FOA_PARAM_EMPLOYE_POSITION", 
    joinColumns = { @JoinColumn(name = "ID_EMPLOYE"),
                    @JoinColumn(name = "COD_ENTREP") }
,
        inverseJoinColumns = {@JoinColumn(name = "FOAPARAMPOSITION_COD_ENTREP"), @JoinColumn(name = "FOAPARAMPOSITION_ID_POSITION")}
)
private List<FoaParamPosition> foaParamPosition;

@ManyToMany
@JoinTable(
    name = "FOA_PARAM_EMPLOYE_POSITION", 
    joinColumns = { @JoinColumn(name = "ID_POSITION"),
                    @JoinColumn(name = "COD_ENTREP") }
        ,
        inverseJoinColumns = {@JoinColumn(name = "FOAPARAMEMPLOYE_COD_ENTREP"), @JoinColumn(name = "FOAPARAMEMPLOYE_ID_EMPLOYE")}

)
private List<FoaParamEmploye> foaParamEmploye;

解决了你的其他question我认为的问题

相关问题