在 Hibernate 的 NamedQuery 中使用用户定义的变量

Posted

技术标签:

【中文标题】在 Hibernate 的 NamedQuery 中使用用户定义的变量【英文标题】:Using User-Defined Variables in NamedQuery in Hibernate 【发布时间】:2016-12-05 21:34:38 【问题描述】:

我的任务是加载类别(按名称加载)和子类别中的所有产品。使用 mysql 后,我创建了 SQL 查询:

select *
from product
where primaryCategoryID in (
select  categoryID
from    (select * from category) categories,
        (select pv := (select categoryID from category where name = 'Tools') as ID) initialisation
where   find_in_set(parentCategory, pv) > 0
and     pv := concat(pv, ',', categoryID)
union 
select categoryID from category where name = 'Tools'
)

您可以在类别名称中提到“工具”。它运作良好但如果您有任何建议 - 非常欢迎您。 在我的项目中,我正在使用 Hibernate,命名查询。问题在于变量@pv。现在它没有被编译并抛出异常作为'意外令牌......' 有谁知道如何在 NamedQuery 中使用变量?

【问题讨论】:

【参考方案1】:

Hibernate 不支持许多 SQL 功能。例如。您在不支持的查询中使用 union。变量也是如此。

尝试使用命名原生查询(参见example)

对于注释,它可能是这样的(来自上面的示例)

@NamedNativeQueries(
    @NamedNativeQuery(
    name = "findStockByStockCodeNativeSQL",
    query = "select * from stock s where s.stock_code = :stockCode",
        resultClass = Stock.class
    )
)
@Entity
@Table(name = "stock", catalog = "mkyong")
public class Stock implements java.io.Serializable 

并将您的查询放在注释中

【讨论】:

谢谢,这是有用的评论。问题是如何通过 Hivernate(Named-Query) 加载类别及其子类别中的所有产品。 发布您的实体和您拥有的当前代码。简而言之,您需要加载类别列表(按名称初始列表),加入子类别(不知道实体中的父子映射),并加入产品(再次不知道您的实体以提供正确的映射) .深度 = 1 很好。如果您需要所有类别子树,恐怕休眠不会提供这样做的方法。因此,您可以使用原生查询并将它们映射到所需的实体。 非常感谢。对于 1-depth 它有效。因此,对于深度大于 1(原始问题)的情况,问题是开放的。如果 Hibernate 不适用于此查询,您对过程/功能有何看法? Hibernate 是否可以通过调用过程/函数来加载数据? 您可以使用 Named Native Query 并按照答案中提到的那样放置工作 SQL。和程序一样

以上是关于在 Hibernate 的 NamedQuery 中使用用户定义的变量的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate namedquery 抛出 ORA-00979: not a GROUP BY 表达式

将@NamedQuery 用于单列选择(J2EE/JPA、Hibernate)是一种好习惯吗?

在 HashMap 上具有内部联接的 HQL NamedQuery

Hibernate用oracle生成无效的sql

使用@namedquery 更新查询无法正常工作

EclipseLink JPA NamedQuery 在 Set 类型的字段中找不到 .size 属性