ElementCollection在JSON响应中返回Null

时间:2017-06-23 14:10:59

标签: hibernate hashmap hql dropwizard

我有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。那是为什么?

1 个答案:

答案 0 :(得分:1)

您已经定义了一个命名查询来检索MyMainClass的所有实例,但在findAll内,您已经使用了SQL查询。这是为什么?您的SQL查询仅从MyMainClass表中检索数据。

您应该使用从session.getNamedQuery("=findAll")获得的查询加载实体。为了让实体填充myMap,您可以:

  1. 使用JPA注释(@ElementCollection(fetch = FetchType.EAGER))急切地标记元素集合
  2. 使用Hibernate注释(@Fetch(FetchMode.JOIN))急切地标记元素集合
  3. 在指定查询(SELECT s FROM MyMainClass s LEFT JOIN FETCH s.myMap
  4. 中使用获取联接
  5. 在关闭会话之前初始化myMap(例如,通过调用从查询中检索到的每个实体上的Hibernate.initialize(entity.getMyMap())
  6. 选项#2和#3可能是性能最高的。请注意,只要从myMap检索MyMainClass的实例,就会急切地提取选项#1和#2 Session。如果这是你的意图,那可能就是你要走的路。