我来自C#实体框架背景,在Java项目中查看JPA,所以我希望我所面对的只是一个概念问题。
我有一个遗留数据库,我无法改变架构,我需要写一个DAL。
我已经生成(简化了示例)以下实体......
@Entity
@Table(name = "crag", catalog = "rad_dbo")
public class CragEntity {
private int id;
@Column(name = "id")
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private int fkSubRegionId;
@Column(name = "fk_subRegionId")
@Basic
public int getFkSubRegionId() {
return fkSubRegionId;
}
public void setFkSubRegionId(int fkSubRegionId) {
this.fkSubRegionId = fkSubRegionId;
}
}
和
@Table(name = "subRegion", catalog = "rad_dbo")
@Entity
public class SubRegionEntity {
private int id;
@Column(name = "id")
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
我尝试过添加一个与CragEntity的关系,以便我可以访问它的subRegion
@ManyToOne
@JoinColumn(name="fk_SubRegionId",nullable=false)
private SubRegionEntity subRegion;
但是当我尝试运行时
select c from CragEntity c where c.subRegion.region = :area
我得到了一个例外
java.lang.RuntimeException: org.hibernate.QueryException: could
不解析属性:subRegion:uk.co.bmc.rad.dal.CragEntity
希望这是可能的,我很慢......
非常感谢您的任何帮助!
答案 0 :(得分:0)
在您的查询中,您正在搜索属性“subRegion”,但在您的实体定义中,您的名称为“fkSubRegionId”,因此您必须更改var名称或查询。 ;)
编辑:对不起我误解了这段关系。您可以使用代码中的关系访问属性(不进行HQL查询)吗?
除非您想在查询中仅选择某些字段,否则我建议使用以下查询:
from CragEntity c where c.subRegion.region='theRegion'
答案 1 :(得分:0)
事实证明有几个问题 - 一个是概念性的,一个是IntelliJ如何产生我正在复制的关系,另一个是椅子和键盘之间......
IntelliJ在“错误”端选择了区域与所有者的子区域关系 - 可能是架构问题而不是IntelliJ的错误。一旦我意识到并找到了解决方案,我可以将其复制到CragEntity和SubRegionEntity
在CragEntity中我添加了:
private SubRegionEntity subRegion;
@ManyToOne
@JoinColumn(name="fk_SubRegionId",nullable=false)
public SubRegionEntity getSubRegion() {
return subRegion;
}
public void setSubRegion(SubRegionEntity subRegion) {
this.subRegion = subRegion;
}
然后在SubRegionEntity中我添加了:
private List<CragEntity> crags;
@OneToMany(mappedBy = "subRegion")
List<CragEntity> getCrags() {
return crags;
}
public void setCrags(List<CragEntity> crags) {
this.crags = crags;
}
此外,似乎任何将成为关系一端的实体类都必须实现可序列化(我猜这些实体被序列化为所有者。因此需要添加到SubRegionEntity和RegionEntity
我的愚蠢当然是查询应该是c.subRegion.region.name
,否则我将RegionEntity类型的对象与字符串... doh进行比较 - 这是我非常愚蠢的错误。
我是TDD的新手,但是一旦我为现有代码编写我认为应该发生的测试,我就会一直走过我的错误(并通过异常和错误给出谷歌关键字: - ))< / p>