我有以下 elementCollection 声明
在 MyMainClass 类中
@Entity
@Table(name = "MyMainClass")
referencedColumnName="id"))
@NamedQueries({
@NamedQuery(
name = "=findAll",
query = "SELECT s FROM MyMainClass s")})
public class MyMainClass implements Comparable<MyMainClass>, Serializable {
@JsonProperty
@ElementCollection(targetClass=String.class)
@Column
Map<String,String> myMap;
public void setMyMap(Map<String,String> myMap) {
this.myMap = myMap;
}
public Map<String,String> getMyMap() {
return this.myMap;
}
}
这将创建一个表 MyMainClass_myMap
mymainclass_id mymapvalue mymapkey
public List<MyMainClass> findAll(String param) {
Session session = sessionFactory.openSession();
Transaction tx = null;
List<MyMainClass> myMainClass = null;
try {
tx = session.beginTransaction();
String sql = "SELECT * FROM MyMainClass WHERE param = :param ;
SQLQuery query = session.createSQLQuery(sql);
query.setParameter("param", param);
query.addEntity(MyMainClass.class);
myMainClass = query.list();
tx.commit();
}
catch(RuntimeException e) {
if (tx != null) {
tx.rollback();
}
throw e;
}
finally {
session.close();
}
return myMainClass;
}
对于 nut 值,JSOn 返回 null。这是为什么?
您已经定义了一个命名查询来检索 的所有实例,MyMainClass
但在 内部findAll
,您使用了 SQL 查询。这是为什么?您的 SQL 查询仅从MyMainClass
表中检索数据。
您应该做的是使用从session.getNamedQuery("=findAll")
. 为了myMap
填充实体,您可以:
@ElementCollection(fetch = FetchType.EAGER)
)将元素集合标记为急切获取@Fetch(FetchMode.JOIN)
)将元素集合标记为急切获取SELECT s FROM MyMainClass s LEFT JOIN FETCH s.myMap
) 中使用 fetch joinmyMap
在关闭会话之前初始化(例如,通过调用Hibernate.initialize(entity.getMyMap())
从查询中检索到的每个实体)选项#2 和#3 可能是性能最好的。请注意,myMap
无论何时MyMainClass
从Session
. 如果这是您的意图,那可能就是要走的路。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句