gpt4 book ai didi

postgresql - Criteriabuilder 之类的,Long 怎么做呢?

转载 作者:行者123 更新时间:2023-11-29 11:50:04 25 4
gpt4 key购买 nike

我尝试使用 Criteriabuilder 中的“like”方法获取基于模式“10%”的所有记录。

我想获取 ID 所在位置的记录 - 101、10002、1003、1000 等...

我用过这段代码:

Predicate p = cb.like(r.<String>get("ID").as(String.class), "10%")

但是我看到 postgres 无法执行这样的查询时出现异常:

SELECT ID, NAME, SOMETHING FROM TABLE WHERE ID LIKE 10%

那是 JPA (Glassfish 4.x) 生成了错误的查询。

正确的查询必须是这样的:

SELECT ID, NAME, SOMETHING FROM TABLE WHERE CAST (ID as TEXT) LIKE '10%'

如何通过 Criteria API 构建查询,我得到了 postgres 的正确查询?

更新:

我试着写一个 CAST 函数:

Expression<String> postgresqlCastFunction = cb.function("CAST", String.class, r.<String>get("ID").as(String.class));
Predicate p = cb.like(postgresqlCastFunction, "10%");

但得到这样的查询:

FROM TABLE WHERE (CAST(ID) LIKE ?)

那么,如何为这个正确的结果在函数中添加 need 表达式 -

FROM TABLE WHERE (CAST(ID as TEXT) LIKE ?) ..

最佳答案

使用 PostgreSQL native 的示例实现 TO_CHAR函数可能如下所示:

JPQL

SELECT r FROM Records r 
WHERE FUNCTION('TO_CHAR', r.ID, 'FM9999999999') LIKE :pattern

条件 API

Path<String> id = r.get("ID");
Expression<String> format = cb.literal("FM9999999999");
Expression<String> function= cb.function("TO_CHAR", String.class, id, format);
ParameterExpression<String> pattern = cb.parameter(String.class, "pattern");
Predicate like = cb.like(function, pattern);
cq.where(like);

您也可以将查询构建为一行:

cq.where(cb.like(cb.function("TO_CHAR", String.class, r.get("ID"), cb.literal("FM9999999999")), cb.parameter(String.class, "pattern")));

执行上面的查询:

Query q = em.createQuery(cq).setParameter("pattern", "10%");

关于postgresql - Criteriabuilder 之类的,Long 怎么做呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29234255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com