Criteriabuilder之类的,如何长时间做到这一点?

eve*_*ers 5 postgresql jpa

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

我想要获取 ID 为 101、10002、1003、1000 等的记录...

我用过这个代码:

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

但我得到了异常,我看到 postgres 无法执行这样的查询:

SELECT ID, NAME, SOMETHING FROM TABLE WHERE ID LIKE 10%
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT ID, NAME, SOMETHING FROM TABLE WHERE CAST (ID as TEXT) LIKE '10%'
Run Code Online (Sandbox Code Playgroud)

如何通过 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%");
Run Code Online (Sandbox Code Playgroud)

但收到这样的查询:

FROM TABLE WHERE (CAST(ID) LIKE ?)
Run Code Online (Sandbox Code Playgroud)

,那么,如何在函数中添加需要表达式以获得正确的结果 -

从表中(CAST(ID as TEXT)喜欢?)..

wyp*_*prz 3

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

JPQL

SELECT r FROM Records r 
WHERE FUNCTION('TO_CHAR', r.ID, 'FM9999999999') LIKE :pattern
Run Code Online (Sandbox Code Playgroud)

标准API

SELECT r FROM Records r 
WHERE FUNCTION('TO_CHAR', r.ID, 'FM9999999999') LIKE :pattern
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

执行上面的查询:

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