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

Posted

技术标签:

【中文标题】获取的关联中不允许使用 with 子句【英文标题】:with-clause not allowed on fetched associations 【发布时间】:2015-12-22 01:19:20 【问题描述】:

我有一个如下所示的名称查询 - 但不断收到来自 Hibernate 的错误,它不允许我的 'with' 子句,因为我正在执行 join 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

提前致谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

在获取的关联上仍然得到'with-clause not allowed;替换'WITH' -> 'ON'时使用过滤器'【参考方案2】:

您不能将 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 "),

【讨论】:

以上是关于获取的关联中不允许使用 with 子句的主要内容,如果未能解决你的问题,请参考以下文章

在 mysql 中不允许使用 FETCH 子句。改用啥替代方法

在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式

DB2 - 错误“不允许使用“WITH ISOLATION USE AND KEEP”子句”

如何使用Order By和With子句

子查询中不允许用order by子句,那么应该怎么办?

JPQL 中的 HQL 'with' 子句