object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例(同时获取Fetch Query JPA)

时间:2018-04-15 10:20:46

标签: hibernate jpa

该问题已被问及here,但我的背景不同。我正在查询(表名 - reports_tbl,实体名称 - 报告)以使用上面的表中的join_column menu_id取出报告,该表连接到(表名 - menu_tbl,实体名称 - 菜单),使用查询

List<Report> reports= entityManager.createQuery(
                "SELECT r FROM Report r WHERE r.menu IN :reports_menu_id",Report.class)
                .setParameter("reports_menu_id",menu)
                .getResultList();

在报表实体中,成员变量菜单声明为:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="menu_pk")
protected Menu menu;

在菜单中,实体报告声明为:

@OneToMany(
            fetch=FetchType.LAZY,
            mappedBy="menu",
            cascade=CascadeType.ALL
        )
protected List<Report> reports = new ArrayList<Report>(); 

但是,如果我尝试将Menu对象传递给setParameter reports_menu_id,我将获得ABOVE EXCEPTION。

Menu menu = new Menu();
menu.setMenuId(Long.parseLong("12"));

如果我将12传递给生成的查询,则返回行。

select report0_.id as id1_3_,... report0_.table_of_contents as table_o24_3_ 
from reports_tbl report0_ 
where report0_.menu_pk in (?) <-- generated query in hibernate

select report0_.id as id1_3_,...report0_.table_of_contents AS table_o24_3_
FROM
reports_tbl report0_
WHERE
report0_.menu_pk IN (12);<-- executed manually by passing value=12 

我错过了什么。 直接传递字符串值12:

List<Report> reports= entityManager.createQuery(
                "SELECT r FROM Report r WHERE r.menu IN 
:reports_menu_id",Report.class)
                .setParameter("reports_menu_id","12")
                .getResultList();

表示参数值[12]与预期类型[com.xyz.entity.Menu(n / a)]不匹配。等待任何帮助。谢谢

1 个答案:

答案 0 :(得分:0)

如果您要使用Report查询menuId,那么您只需在查询WHERE r.menu.menuId IN :reports_menu_id中替换此部分,然后直接传递ID ..上述问题是你试图在查询中使用非托管实体