如何使用 cast 编写 hql 查询?

Posted

技术标签:

【中文标题】如何使用 cast 编写 hql 查询?【英文标题】:How do I write hql query with cast? 【发布时间】:2011-06-15 01:09:25 【问题描述】:

我需要使用 hql 合并 2 个表,两者都有公共列,但 table1 的公共列是 integertable2 的公共列是 String

例如,

select a.id as id,a.name as name,b.address as address 
from Personal as a,Home as b 
where a.id=b.studid

这里a.idintegerb.stduidstring,但是两列的数据是相同的。

如何使用 hql 查询得到查询结果?

【问题讨论】:

【参考方案1】:

我不得不像这样将它转换为字符串:

 @Query( value = "select new com.api.models.DResultStatus("+
            "cast(ds.demoId as java.lang.String),cast(ds.comp as java.lang.String),cast(ds.dc as java.lang.String),cast(be.buildUrl as java.lang.String)")

【讨论】:

【参考方案2】:

您确实需要考虑为什么需要通过不同类型的属性连接两个实体。它很可能表明需要重构一些实体,其中可能包括更改基础数据库表的列的数据类型。如果模型正确,则无需扭曲 Hibernate。

【讨论】:

虽然选角会在短期内解决您的问题,但我认为 01es 是有道理的。当您需要转换 ID 时,似乎出了点问题。 我在堆栈溢出中看到了这些类型的非答案。一方面,01es 关于模型最有可能被破坏的观点可能是正确的。另一方面,大多数现实世界的系统都不是一蹴而就的。【参考方案3】:

HQL支持CAST(如果底层数据库支持),可以使用:

select a.id as id,a.name as name,b.address as address 
from Personal as a,Home as b
where cast(a.id as string) = b.studid 

另请参阅:

16.10. Expressions

【讨论】:

【参考方案4】:

刚刚注意到您正在使用 JPA,在那里您无法转换或转换数据类型。在查询语言中,只能比较相同类型的值!阅读http://download.oracle.com/javaee/5/tutorial/doc/bnbuf.html#bnbvu

【讨论】:

是的,我的查询是错误的,但我需要使用 hql cast 进行此查询的结果...有可能吗? 我认为它只能在休眠中使用,但您使用的是 JPA? @axtavt 为您提供了指向休眠文档的链接,这是错误的,我对吗?

以上是关于如何使用 cast 编写 hql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 hql 查询或条件查询以根据时间戳获取最新记录

在 ( ... ) 查询中编写 HQL 的正确方法

如何编写 hql 子查询以防万一呢?

如何在带有 Oracle 数据库的 HQL 查询中使用当前日期?

如何使用休眠查询语言查找两个时间戳之间的差异

将 HQL 与 MySQL 一起使用,如何在 group by 之前对结果集进行排序,以便选择正确的记录?