Java JPA标准API和Oracle JSON_表函数
我在基于sql代码用java编写标准时遇到问题,我们必须使用JSON_表函数并按参数搜索:Java JPA标准API和Oracle JSON_表函数,java,sql,oracle,criteria-api,criteriaquery,Java,Sql,Oracle,Criteria Api,Criteriaquery,我在基于sql代码用java编写标准时遇到问题,我们必须使用JSON_表函数并按参数搜索: select tab1.id from TABLE1 tab1 left join TABLE2 param_json on tab1.id = param_json.TABLE_1_ID, json_table( param_json.P
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=getEntityManager().getCriteriaBuilder();
CriteriaQuery=builder.createQuery(Long.class);
根table1Root=query.from(Table1.class);
Join jsonEJBJoin=table1Root.Join(Table1.table2Elements);
//如何添加json_表函数
列表条件=新建LinkedList();
谓词[]谓词=新谓词[whereConditions.size()];
//如何基于json_表函数添加where条件
query.where(whereConditions.toArray(谓词));
query.select(table1Root.get(Table1.id));
List resultList=getEntityManager().createQuery(查询)
.setMaxResults(10)
.getResultList();
这很难,因为你把螺丝刀当作锤子使用。CriteriaAPI的全部要点是拥有独立于平台的代码,而不依赖于专有函数,如json\u table
如果您有数据库访问权限,我认为解决此问题最干净的方法是创建一个视图,以隐藏JPA中所有Oracle特定的代码,例如:
create or replace view VIEW1 (TABLE_1_ID, PARAMCODE, DISPLAYVALUE) as
select param_json.TABLE_1_ID, jt.paramCode, jt.displayValue
from TABLE2 param_json,
json_table(
param_json.PARAMS_JSON, '$[*]'
COLUMNS (
paramCode VARCHAR2(4000) PATH '$.paramCode',
displayValue VARCHAR2(4000) PATH '$.displayValue'
)
) jt;
然后用View1替换JPA代码中的表2
如果您不能修改数据库,我认为您必须放弃Criteria API,使用带有绑定变量参数的NativeQuery,例如:
List<Long> resultList = getEntityManager().createNativeQuery("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 :param2))" )
.setParameter("param1", param1)
.setParameter("param2", "%" + value + "%" )
.setMaxResults(10)
.getResultList();
List resultList=getEntityManager().createNativeQuery(“选择tab1.id
从表1到表1
左连接
表2 tab1.id=param_json.TABLE_1_id上的param_json,
json_表(
param_json.PARAMS_json,$[*]
纵队(
paramCode VARCHAR2(4000)路径“$.paramCode”,
displayValue VARCHAR2(4000)路径“$.displayValue”
)
)jt
其中jt.paramCode=:param1和更低(jt.displayValue)如:param2)))
.setParameter(“参数1”,参数1)
.setParameter(“参数2”,“百分比”+值+“%”)
.setMaxResults(10)
.getResultList();
作为补充说明,我建议不要使用区分大小写的Oracle标识符(带双引号)。有些Oracle教程使用它们,但它们只会使事情变得更复杂。您添加了SQL查询和一些Java代码,但没有描述实际工作不正常的内容。您试图实现什么,哪些不起作用?criteria api必须生成与上面相同的查询,json_表是oracle特定的函数,我不知道如何在criteria api中使用它
List<Long> resultList = getEntityManager().createNativeQuery("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 :param2))" )
.setParameter("param1", param1)
.setParameter("param2", "%" + value + "%" )
.setMaxResults(10)
.getResultList();