JPQL 中等效的 UTL_RAW.BIT_OR

Posted

技术标签:

【中文标题】JPQL 中等效的 UTL_RAW.BIT_OR【英文标题】:Equivalent UTL_RAW.BIT_OR in JPQL 【发布时间】:2021-10-04 22:12:25 【问题描述】:

我正在尝试使用结果 DTO 进行命名查询,其中有一个我必须使用该函数计算的字段。有没有等价的?

SELECT new BitsDTO( 
UTL_RAW.BIT_OR(b.bitsA, b.bitsB) as bitsCalculated)
FROM Bits b
where b.id = ?;

谢谢。

【问题讨论】:

你能显示你的属性b.bitsA映射到什么java类型吗? 字节[] bitsA; byte[] bitsB; 您可以尝试在您的自定义休眠方言中注册UTL_RAW.BIT_OR 函数,该函数将扩展一些标准休眠方言。至于如何注册函数,例如参见this。然后就可以在jpql中使用了。 【参考方案1】:

如果你想在 JPQL 中调用数据库函数,你可以这样做

SELECT new BitsDTO(
    function("UTL_RAW.BIT_OR", b.bitsA, b.bitsB)
)
FROM Bits b
where b.id = ?

这样你就可以调用任何数据库函数。第一个参数是函数名。

【讨论】:

您收到错误消息吗?以及生成的 SQL 是什么样子的?【参考方案2】:

@Simon Martinelli 几乎是对的。从*** select 子句项调用数据库函数需要强制转换,以便 Hibernate 知道如何从 JDBC 读取值,如下所示:select new BitsDTO(cast(function('UTL_RAW.BIT_OR', b.bitsA, b.bitsB) as java.lang.String) ...

替代方法是在方言中将该函数注册为SQLFunction,并为其提供适当的返回类型。然后你可以像原来的问题一样使用。

【讨论】:

以上是关于JPQL 中等效的 UTL_RAW.BIT_OR的主要内容,如果未能解决你的问题,请参考以下文章

日期声明之间的 JPQL SELECT [关闭]

JPQL 构造函数表达式中的 JPQL 和子查询

如何仅检索 JPQL 或 HQL 中实体的某些字段? JPQL 或 HQL 中的 ResultSet 等价物是啥?

如何在 JPQL 中选择随机 10 条记录?

JPQL 测试值是不是在数组中

如何在 JPQL 中检查 UUID 空值?