查询数字varchar并将其与querydsl进行比较

时间:2019-07-21 13:24:59

标签: java postgresql hibernate spring-data-jpa querydsl

让我们说我有三个表,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()似乎也无济于事

版本

  • PostgreSQL 9.5
  • 休眠5.4
  • querydsl 4.2.1

1 个答案:

答案 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)));