Hibernate - 从本地表外键中选择

时间:2016-10-02 20:42:48

标签: java mysql hibernate

我有2个表,combo_commentcombo(它可能是论坛帖子或堆栈溢出中的问题),其中combo_id是外键combo_comment,我想基于combo_id选择评论,而不使用任何类型的加入,我想基本上这样做

SELECT * FROM COMBO_COMMENT where COMBO_ID= 3;

我指的是COMBO_COMMENT.COMBO_ID,而不是COMBO.COMBO_ID,但是当我尝试用hibernate执行此操作时,它会返回注释中的组合对象,我知道我可以使用@JsonIgnore在返回答案时忽略组合对象,但后来我没有combo_id字段。我尝试过使用标准和HQL

这是我的combo_comment实体类,没有getter和setter(它们没有任何类型的注释)

@Entity
@Table(name="COMBO_COMMENT")
public class ComboComment {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="COMMENT_ID",nullable = false)
private int commentId;
@ManyToOne(fetch = FetchType.EAGER,targetEntity = Combo.class,cascade = CascadeType.ALL)
@JoinColumn(name = "COMBO_ID",nullable = false,referencedColumnName="COMBO_ID")
private Combo combo;
@Column(name="COMBO_COMMENT",nullable = false)
private String ComboComment;
@Column(name="POST_DATE",nullable = false)
private long postDate;
public ComboComment(){

}

}

这是我尝试做的两种方式

标准:

Criteria criteria = createEntityCriteria();
    criteria.add(Restrictions.eq("combo.comboId", comboId));
    criteria.addOrder(Order.desc("postDate"));
    criteria.setMaxResults(10);
    if (page != 0) {
        criteria.setFirstResult(page * 10);
    }

使用HQL:

String hql = "from ComboComment where combo.comboId =:comboId";
    Query query = getSession().createQuery(hql).setInteger("comboId", comboId);

这是我设法在没有任何异常情况下获得成功回复的唯一两种方式

更新

FetchType设置为LAZY

时出现例外情况
HTTP Status 500 - Could not write content: could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.mycompany.ufggservice.model.ComboComment["combo"]->com.mycompany.ufggservice.model.Combo_$$_jvst3d5_2["comboId"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.mycompany.ufggservice.model.ComboComment["combo"]->com.mycompany.ufggservice.model.Combo_$$_jvst3d5_2["comboId"])

2 个答案:

答案 0 :(得分:0)

"但是当我尝试用hibernate执行此操作时,它会返回注释中的组合对象"

据我所知,您希望使用get of hibernate等方法来获取某个对象,但是您也在使用DB来查找关联的对象名称组合。

您收到此行为是因为您正在使用FetchType.EAGER,它表示要休眠以获取请求对象中的所有相关关联对象。

因此,如果您尝试获取评论,它还会为您提取与之关联的组合。

解决方案就是使用:

fetch = FetchType.LAZY

答案 1 :(得分:0)

经过更多的研究后,我设法运行fetchType.Lazy查询,我需要的只是配置MappingJackson2HttpMessageConverter并添加hibernateModule(在我的情况下是hibernate5) 取自Avoid Jackson serialization on non fetched lazy objects,查询未加入组合表以获取我想要的信息。

我仍然没有在json mapper中得到我想要的回复,但最终我会弄清楚