img*_*gr8 8 hibernate inner-join hibernate-mapping
我有遗留代码,我试图映射到新代码.
OLD_PERSON
pid
sid
name
age
NEW_PERSON
pid
sid
fid
age
RESOLVE_PERSON
pid
fid
status
Run Code Online (Sandbox Code Playgroud)
Java类
domain.Person {
ID _id;
String _name;
Integer _age;
}
Run Code Online (Sandbox Code Playgroud)
在传统世界中,只有一个表:OLD_TABLE.hibernate映射很简单,只有一个类及其列.在新的世界中,我必须使用上面的3个表并生成一个实体,其中名称来自OLD_PERSON,年龄来自NEW_PERSON.所以基本上SQL查询是:
select op.name as name, np.age as age
from OLD_PERSON op
INNER JOIN RESOLVE_PERSON rp
on rp.pid = op.pid
INNER JOIN NEW_PERSON np
on np.pid = rp.pid and np.fid = rp.fid and np.sid = op.sid
where rp.status = 'CURRENT'
Run Code Online (Sandbox Code Playgroud)
经过研究/谷歌搜索,我发现我可以使用"辅助表",它相当于hibernate xml中的"JOIN表".注意:我不能使用注释,因为这段代码很旧,我仍然在使用hibernate3.5.6.
所以我在映射文件中添加了一个连接表:
<class name="domain.Person" table="OLD_PERSON">
<composite-id name="_id" class="Id">
<key-property access="property" name="key1" type="long" column="pid" />
<key-property access="property" name="key2" type="int" column="sid" />
<generator class="assigned" />
</composite-id>
<property name="_Name" type="String" column="name" />
<join table="NEW_PERSON" fetch="join" inverse="false">
<key>
<column name="pid" />
<column name="sid" />
</key>
<property name="_age" column="age" not-null="true" />
</join>
</class>
Run Code Online (Sandbox Code Playgroud)
但是连接到NEW_PERSON表需要使用RESOLVE_PERSON表进行内部连接.我尝试使用subselect,但它不正确使用.我无法在这里任何地方插入公式.
有关如何实现这一目标的任何指示?我基本上要求的是如何对JOIN应用标准/约束检查.
小智 1
我遇到了和你问题类似的情况。我已将第三个表映射到一个实体,并使用该实体的 DAO 来通过其属性获取某些内容。
这是代码(因为我使用了注解,所以这不是你可以直接使用的东西,但希望它能给你一些启发),
@Entity
@Table(name = "resolve_person")
public class ResolvePerson implements java.io.Serializable {
private OldPerson old;
private NewPerson new;
...
@ManyToOne // you may change it to other relationships
@JoinColumn(name = "pid", nullable = false)
public OldPerson getOldPerson () {
return this.old;
}
public void setOldPerson (OldPerson old) {
this.old = old;
}
@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "foreign",
parameters = { @org.hibernate.annotations.Parameter(name = "property", value = "fid") })
@Column(name = "fid", nullable = false, unique = true)
public NewPerson getNewPerson () {
return this.New;
}
public void setNewPerson (NewPerson new) {
this.new = new;
}
}
Run Code Online (Sandbox Code Playgroud)
DAO 很正常,
public List findByProperty(String propertyName, Object value) {
log.debug("finding ResolvePerson instance with property: "
+ propertyName + ", value: " + value);
try {
String queryString = "from ResolvePerson as model where model."
+ propertyName + "= ?";
Query queryObject = getSession().createQuery(queryString);
queryObject.setParameter(0, value);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以将属性“status”设置为“current”进行查询。
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |