我尝试使用Criteriabuilder中的“like”方法获取基于模式“10%”的所有记录。
我想获得ID为-101,10002,1003,1000等的记录......
我使用此代码:
Predicate p = cb.like(r.<String>get("ID").as(String.class), "10%")
但是我得到了Exception,我看到postgres不能执行这样的查询:
SELECT ID, NAME, SOMETHING FROM TABLE WHERE ID LIKE 10%
即JPA(Glassfish 4.x)生成wrond查询。
正确的查询必须是这样的:
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 ?)
,那么,如何在函数中添加需要表达式以获得正确的结果 -
FROM TABLE WHERE(CAST(ID as TEXT )LIKE?)..
答案 0 :(得分:1)
使用PostgreSQL本机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%");