Hibernate中<set><subselect>的注解等价形式迁移咨询
用Hibernate注解替代
<set> + <subselect>的XML配置 嘿,刚好帮你解决这个迁移问题!你不需要定义数据库视图,直接用Hibernate的扩展注解就能完美替代原来的XML配置,具体写法如下:
首先,假设你的实体类里对应的集合字段是someSet,泛型类型是你自定义MyUserType对应的Java类型(比如String或自定义POJO,取决于MyUserType的实现),注解写法如下:
import org.hibernate.annotations.Key; import org.hibernate.annotations.Subselect; import org.hibernate.annotations.Type; import javax.persistence.ElementCollection; import javax.persistence.Column; import java.util.Set; // 你的实体类注解... public class YourEntity { @ElementCollection @Subselect("some long SQL query") // 直接把原来CDATA里的SQL放这里,不用CDATA包裹 @Key(column = "fk") // 对应XML里的<key column="fk"/> @Column(name = "value") // 对应<element>的column属性 @Type(type = "com.yourpackage.MyUserType") // 替换成你的MyUserType全类名 private Set<YourValueType> someSet; // getter、setter... }
每个注解的作用说明:
@ElementCollection:对应XML中的<set>+<element>,告诉Hibernate这是一个基本类型/自定义类型的集合,而非实体集合@Subselect:直接替代XML里的<subselect>标签,把你的查询SQL直接写进去即可,无需CDATA@Key:来自Hibernate的扩展注解,对应XML的<key column="fk"/>,指定子查询结果中关联当前实体的外键列@Column:指定子查询结果中存储集合元素值的列名,对应<element>的column属性@Type:指定Hibernate的自定义用户类型,对应<element>的type属性,记得写全类名避免找不到类
注意事项:
- 确保你的子查询SQL返回的结果必须包含
fk(外键列)和value(元素值列)这两个字段,Hibernate需要通过这两个字段把查询结果映射到当前实体的集合中 - 这种基于子查询的集合通常是只读的,Hibernate不会支持对集合进行增删改操作,如果需要修改逻辑,可能需要单独处理
- 如果你使用的是Hibernate 5.x及以上版本,这些注解的包路径都是正确的,记得引入对应的依赖
内容的提问来源于stack exchange,提问作者Marius Schär
相关产品推荐
相关产品推荐

