我有两个实体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_ENTREP
,ID_POSITION
和ID_EMPLOYE
字段。
@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=?
答案 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_ENTREP
和foaParamPositions_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我认为的问题