我有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。那是为什么?
答案 0 :(得分:1)
您已经定义了一个命名查询来检索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
)myMap
(例如,通过调用从查询中检索到的每个实体上的Hibernate.initialize(entity.getMyMap())
)选项#2和#3可能是性能最高的。请注意,只要从myMap
检索MyMainClass
的实例,就会急切地提取选项#1和#2 Session
。如果这是你的意图,那可能就是你要走的路。