【问题标题】:Query for numerical varchars and compare them, with querydsl使用 querydsl 查询数字 varchars 并比较它们
【发布时间】:2019-11-29 16:45:46
【问题描述】:

假设我有三个表,profile 和 profile_elements(一对多关联)和 element_type。

profile_elements 具有配置文件的所有元素以及 element_type_id 作为 element_type 表的外键,并具有列“value”,即 VARCHAR。

我想对 profile_elements 进行高级搜索。当我使用字符串时当然没有问题,但是例如,如果我想与“值”列的值进行比较(大于等),我不能,即使我知道,即当 element_id=1 时,这些值将是数字 varchars。 我试图建立一个像

这样的谓词
QprofileElements.profileElements.any().elementId.eq(1).and(QprofileElements.profileElements.any().value.castToNum(Long.class).gt(12345)

但是 hibernate 将它作为两个单独的 select-from-where 查询来处理,它会尝试将列的所有值强制转换为 long,因此当它尝试转换包含字符的值时会发生错误。我什至设法让它如此hibernate将其视为表单的一个查询

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

【问题讨论】:

  • 为什么要将数字存储在 varchar 列中?这是一个巨大的错误开始

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


【解决方案1】:

你不需要嵌套的 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)));

【讨论】:

  • 正如我上面提到的,我已经尝试过这个 QueryDSL 表达式但不起作用。 db 查询确实有效,但据我所知,这并不总是必要的。关于在 Varchar 中存储数字,这是因为值的类型很多(例如,它可以是最多 5 个字符串、最多 20 个字符串、10 位数字、浮点数等)。
  • @zlash:我不知道这个 any() 方法,但是使用 SQLQueryFactory 并使用 select() 我编辑的答案中的代码有效。
  • 还是一样的问题!它创建了两个单独的查询并迭代所有表,因此当它尝试转换包含字符的值时会引发错误。
  • @zlash:我的答案中的代码创建了一个 single 查询 - 至少在使用带有“普通 SQL”的 QueryDSL 时。它将运行:select ... from profile_element pe where pe.attrib_id = ? and cast(pe.attrib_value as int8) > ?。但是,我没有在 QuerySQL 之上添加像 Hibernate 这样的混淆层的经验。
猜你喜欢
  • 2022-07-20
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2020-07-17
  • 2011-11-06
  • 2018-10-10
  • 2017-11-22
相关资源
最近更新 更多