如何在criteria api表达式中插入本机Oracle调用或强制转换(到NVARCHAR2)?

如何在criteria api表达式中插入本机Oracle调用或强制转换(到NVARCHAR2)?,oracle,jpa,casting,eclipselink,criteria-api,Oracle,Jpa,Casting,Eclipselink,Criteria Api,我在Eclipselink中有一个复杂的动态查询,其中有一个case表达式,它涉及两个不同的列,一个是VARCHAR2,另一个是NVARCHAR2 它需要是一个case表达式,因为我还希望能够按照结果列进行排序,所以不能同时查询这两个列。在Java中,两者都只是映射为一个字符串,所以您甚至看不出有什么区别 对于我的查询,Eclipselink创建以下select表达式: CASE WHEN (t9.STRINGVALUE IS NOT NULL) THEN t9.STRINGVALUE

我在Eclipselink中有一个复杂的动态查询,其中有一个case表达式,它涉及两个不同的列,一个是VARCHAR2,另一个是NVARCHAR2

它需要是一个case表达式,因为我还希望能够按照结果列进行排序,所以不能同时查询这两个列。在Java中,两者都只是映射为一个字符串,所以您甚至看不出有什么区别

对于我的查询,Eclipselink创建以下select表达式:

CASE
  WHEN (t9.STRINGVALUE IS NOT NULL)
  THEN t9.STRINGVALUE
  ELSE t10.OTHERSTRINGVALUE
END ,
准则代码为:

Expression<String> str = firstRoot.get("stringValue");
Expression<String> strExp = cb.<String> selectCase().when(cb.isNotNull(str), str)
.otherwise(otherRoot.<String> get("otherStringValue"));
q.multiselect(..., strExp, ...);
但我不知道怎么做

我在实体的字段上尝试了一个转换器,或者在两个字段的.get()-表达式上都尝试了.as(String.class)


所以问题是:有没有一种方法可以将像NVARCHAR2这样的Oracle类型传递给.as()表达式?我是否可以使用criteria API插入对强制转换(…作为NVARCHAR2)的调用?有没有其他方法让它生成自定义SQL,因为我确实无法重写整个查询,只是因为JPA或EL没有提供您可能需要一些自定义SQL的可能性…

在criteria API中,唯一的方法是从otherRoot创建一个新的PathImpl。获取(“otherStringValue”)路径,将EclipseLink本机强制转换表达式作为表达式节点传递。比如:

PathImpl path = (PathImpl)otherRoot.<String> get("otherStringValue");
Path castPath = new PathImpl(path, em.getMetamodel(), path.getJavaType(), path.getCurrentNode().cast("NVARCHAR2"), path.getModel());

Expression<String> str = firstRoot.get("stringValue");
Expression<String> strExp = cb.<String> selectCase().when(cb.isNotNull(str), str)
.otherwise(castPath );
q.multiselect(..., strExp, ...);
PathImpl路径=(PathImpl)otherRoot。获取(“其他字符串值”);
Path castPath=new PathImpl(Path,em.getMetamodel(),Path.getJavaType(),Path.getCurrentNode().cast(“NVARCHAR2”),Path.getModel());
表达式str=firstRoot.get(“stringValue”);
表达式strExp=cb。selectCase().when(cb.isNotNull(str),str)
。否则(castPath);
q、 多选(…,strExp,…);

您是否尝试过强制转换(t10.OTHERSTRINGVALUE作为NVARCHAR2)?这正是我想要的SQL,但我如何在criteria API中指定它?EclipseLink JPQL支持强制转换:但看起来您需要提交一个功能请求才能将该支持扩展到criteria Query API。谢谢!当I.cast(“NVARCHAR2(120)”或类似的代码(否则:ORA-906缺少左括号)时,这种方法可以工作。现在我只需要让我们的架构师允许我获得实体管理器实例。。。
PathImpl path = (PathImpl)otherRoot.<String> get("otherStringValue");
Path castPath = new PathImpl(path, em.getMetamodel(), path.getJavaType(), path.getCurrentNode().cast("NVARCHAR2"), path.getModel());

Expression<String> str = firstRoot.get("stringValue");
Expression<String> strExp = cb.<String> selectCase().when(cb.isNotNull(str), str)
.otherwise(castPath );
q.multiselect(..., strExp, ...);