我在用java编写基于sql代码的条件时遇到了问题,我们必须使用json表函数和按参数搜索:
select tab1.id
from TABLE1 tab1
left join
TABLE2 param_json on tab1.id = param_json.TABLE_1_ID,
json_table(
param_json.PARAMS_JSON, '$[*]'
COLUMNS (
"paramCode" VARCHAR2(4000) PATH '$.paramCode',
"displayValue" VARCHAR2(4000) PATH '$.displayValue'
)
) jt
where jt."paramCode" = 'param1' and lower(jt."displayValue") like '%value%');
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Long> query = builder.createQuery(Long.class);
Root<Table1> table1Root = query.from(Table1.class);
Join<Table1, Table2> jsonEJBJoin = table1Root.join(Table1_.table2Elements);
//how add json_table function
List<Predicate> whereConditions = new LinkedList<>();
Predicate[] predicates = new Predicate[whereConditions.size()];
//how add where conditions based on json_table function
query.where(whereConditions.toArray(predicates));
query.select(table1Root.get(Table1_.id));
List<Long> resultList = getEntityManager().createQuery(query)
.setMaxResults(10)
.getResultList();
1条答案
按热度按时间5vf7fwbs1#
这很难,因为你用螺丝刀当锤子。criteriaapi的全部要点是拥有独立于平台的代码,而不依赖于诸如
json_table
.如果您有数据库访问权限,我认为解决这个问题的最干净的方法是创建一个视图来隐藏jpa中所有特定于oracle的代码,例如:
然后用view1替换jpa代码中的table2。
如果您不能修改数据库,我认为您必须放弃criteria api,使用带有绑定变量参数的nativequery,例如:
另外,我建议不要使用区分大小写的oracle标识符(带双引号)。一些oracle教程使用它们,但它们只会使事情变得更复杂。