Java JPA标准API和Oracle 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

我在基于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.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();