获取的关联不允许使用with子句

时间:2015-09-24 12:27:47

标签: mysql hibernate jpa jpa-2.1

我有一个如下所示的名称查询 - 但是从Hibernate那里得到一个错误,它不会允许我的'with'子句,因为我正在进行连接获取。

我需要加入fetch - 因为它有一个相关的项目,然后我不想它出现在对象上。

    @NamedQuery(name = "Item.findItem", 
        query = "SELECT DISTINCT(c) FROM Item c " +                 
                "JOIN FETCH c.storeRelations as childStoreRelation " +                                                              
                "LEFT JOIN FETCH c.relatedItems as relatedRelations WITH relatedRelations.store.id = childStoreRelation.store.id " +
                "WHERE c.id = :itemId " +                                                                   
                "AND childStoreRelation.store.id = :storeId " +
                "AND childStoreRelation.deleted <> 'Y' " +
                "ORDER BY c.partnumber "),

建议将'with'部分移动到我的where子句 - 但这会导致无效结果。

考虑项目A可能需要与之相关的项目 - 但对于某些商店,这些关系无效。

如果放入where子句,那么没有关系的商店将不会显示主项,因为SQL将由Hibernate构建,因此它要求如果存在任何关系,那么它们必须对商店有效 - 否则不会获取任何内容: - (

所以经典修复发现许多地方(store.id为null或store.id =:storeId)将无效。

有人还有其他工作吗?

我正在运行Hibernate 4.3.11

提前致谢

2 个答案:

答案 0 :(得分:0)

您不能将 LEFT JOIN FETCH 与子句一起使用。 请删除 WITH 子句并将它们移至 WHERE 子句。

应该是这样的:

@NamedQuery(name = "Item.findItem", 
    query = "SELECT DISTINCT(c) FROM Item c " +                 
            "JOIN FETCH c.storeRelations as childStoreRelation " +                                                              
            "LEFT JOIN FETCH c.relatedItems as relatedRelations " +
            "WHERE c.id = :itemId " +     
            "AND relatedRelations.store.id = childStoreRelation.store.id" +                                 
            "AND childStoreRelation.store.id = :storeId " +
            "AND childStoreRelation.deleted <> 'Y' " +
            "ORDER BY c.partnumber "),

答案 1 :(得分:-3)

您需要ON关键字而不是WITH关键字。