首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA标准API和Oracle JSON_TABLE函数

JPA标准API和Oracle JSON_TABLE函数
EN

Stack Overflow用户
提问于 2020-11-23 13:11:42
回答 1查看 396关注 0票数 0

我在用java编写基于sql代码的条件时遇到了问题,我们必须使用JSON_TABLE函数并按参数进行搜索:

代码语言:javascript
复制
    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%');
代码语言:javascript
复制
    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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-23 16:59:00

这很难,因为你用螺丝刀做锤子。标准API的全部目的是拥有独立于平台的代码,它不依赖于诸如json_table这样的专有函数。

如果您有数据库访问权限,我认为解决这一问题的最干净的方法是创建一个视图来向JPA隐藏所有特定于Oracle的代码,例如:

代码语言:javascript
复制
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;

然后将JPA代码中的Table2替换为View1。

如果您不能修改数据库,我认为您将不得不放弃条件API,使用绑定变量参数的NativeQuery,如下所示:

代码语言:javascript
复制
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();

另外,我建议不要使用区分大小写的Oracle标识符(带有双引号)。一些Oracle教程使用它们,但它们只会使事情变得更加复杂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64969105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档