让我们说我有三个表,profile和profile_elements(一对多关联)和element_type。
profile_elements具有概要文件的所有元素,还有element_type_id作为element_type表的外键,并且具有“值”列,即VARCHAR。
我想对profile_elements进行高级搜索。当我使用Strings时,当然没有问题,但是例如,如果我想与“ value”列的值进行比较(大于等),即使我知道,例如,当element_id = 1时,这些值将是数字varchars。 我试图建立像
这样的谓词QprofileElements.profileElements.any().elementId.eq(1).and(QprofileElements.profileElements.any().value.castToNum(Long.class).gt(12345)
但是hibernate将其作为两个单独的“从哪里选择”查询来处理,并且它尝试将其列的所有值强制转换为long值,因此当它尝试转换包含字符的值时会发生错误。我什至设法使它处于休眠状态,将其视为形式为
的一个查询where element_id=1 AND cast(value)>12345
但是它仍然有相同的问题。
有没有一种方法可以解决querydsl或其他问题?如果不是,是否有构造此查询的方法
select *
from(
(select * from profile_element pe where pe.element_id=1)
) as sq
where cast(sq.value as int8)>12345
与querydsl?
我也尝试过JPAExpressions,即使when()。then()似乎也无济于事
版本
答案 0 :(得分:0)
您不需要嵌套的SELECT,只需编写以下内容即可:
select *
from profile_element pe
where pe.element_id = 1
and cast(pe.value as int8) > 12345;
使用SQLQueryFactory时,以下内容适用于我:
QprofileElements pe = new QprofileElements("pe");
queryfactory.
select(pe.all()).
from(pe).
where(pe.attribId.eq(1).
and(pe.attribValue.castToNum(Long.class).gt(1)));