2017-02-15 157 views
0

我试图用JSON_VALUE功能克里特标准API查询()是Oracle12c:JPA标准API与oracle12c JSON_VALUE功能

select * from orderswhere (JSON_VALUE(duty, '$.department') in (? , ? , ? ,? , ? , ? , ?)); 

MODEL:

@Entity 
@Table(name = "orders") 
@EntityListeners(AuditingEntityListener.class) 
public class Trade implements Serializable { 
    @Convert(converter = JpaConverterJson.class) 
    private Map<String, Object> duty; 
    ..... 
} 

private Specification<InvoicePurchase> reportFormToSpec(Map<String, Object> 
    params) { 
     return (root, query, cb) -> { 
      List<Predicate> predicates = new ArrayList<>(); 
     if (!StringUtils.isEmpty(params.get("department"))) { 
      Predicate predicate = cb.like(cb.function("json_value", String.class, 
        root.get("duty"), 
        cb.literal("$.department")) 
        , params.get("department")); 
      predicates.add(predicate); 
     } 
      return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction(); 
     }; 

    } 

但是,得到的异常:ohengine。 jdbc.spi.SqlExceptionHelper:ORA-40454:路径表达式不是文字

我在网上搜索了很长时间。但没用。请帮助或尝试提供一些想法如何实现这一点。

ERROC CODE:

2017-11-23 12:26:55.271 WARN 11972 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 40454, SQLState: 99999 
    2017-11-23 12:26:55.271 ERROR 11972 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-40454: path expression not a literal 
+0

错误消息:2017-02-15 14:22:13.210 WARN 23176 --- [nio-8080-exec-7] ohengine.jdbc.spi.SqlExceptionHelper:SQL错误:40454,SQLState:99999 2017- 02-15 14:22:13.210 ERROR 23176 --- [nio-8080-exec-7] ohengine.jdbc.spi.SqlExceptionHelper:ORA-40454:路径表达式不是文字 –

回答

0

这是不工作的原因,是在后台,Hibernate会产生这样的SQL:

SELECT * FROM T WHERE JSON_VALUE(?, ?)=? 

..而这并不与Oracle合作。

解决方法是,内联这些值。首先一个小的辅助类:

public class HibernateInlineExpression extends LiteralExpression<String> { 

    public HibernateInlineExpression(CriteriaBuilder criteriaBuilder, String literal) { 
     super((CriteriaBuilderImpl) criteriaBuilder, literal); 
    } 

    @Override 
    public String render(RenderingContext renderingContext) { 
     return getLiteral(); 
    } 
} 

使用上面,你现在可以做JSON表达式谓词:

cb.equal(cb.function("JSON_VALUE", String.class, 
       new HibernateInlineExpression(cb, "JSON_COLUMN"), 
       new HibernateInlineExpression(cb, "'$.my.json.property'")), 
    new LiteralExpression<>((CriteriaBuilderImpl) cb, String.class, "somevalue")); 

当然以上是一个特定于Hibernate的实现,的EclipseLink的用户,等等。必须拿出类似的东西。看我的blog post about using JSON functions of Oracle from JPA/Hibernate的一些其他技巧。

+0

它解决了我的问题 –

+0

Ran进入相同事情几天前,伟大的它适合你:) –