通过查询dsl调用Oracle的本机函数(wm_concat)

时间:2014-11-17 09:47:06

标签: querydsl jpa-2.1

我的问题是我不知道如何通过查询dsl来正确调用Oracle的本机函数。

我的SQL查询是

select  wm_concat(COU_NAME) 
from COUNTRIES
where COU_COUNTRY_ID_PK in (1,2)

我的查询dsl版本是

JPAQuery query = new JPAQuery(entityManager); 
List<String> test = query.from(qCountr3).where(qCountr3.id.in(1L,2L)).list(StringTemplate.create("function('wm_concat',{0})",qCountr3.name));

生成的jqpl是:

select function('wm_concat',qCountry3.name)
from Country qCountry3
where qCountry3.id in (?1)

我得到以下异常

java.lang.IllegalStateException:没有节点的数据类型:org.hibernate.hql.internal.ast.tree.MethodNode   - [METHOD_CALL] MethodNode:'function(wm_concat)'     + - [METHOD_NAME] IdentNode:'wm_concat'{originalText = wm_concat}

我正在使用JPA 2.1和hibernate

此致

1 个答案:

答案 0 :(得分:0)

以下代码适用于我。

List<String> list 
  = query
    .from(qCountr3)
    .where(qCountr3.id.in(1L,2L))
    .list(Expressions
             .stringTemplate
                ("function('WM_CONCAT',{0})"
                ,qCountr3.name
                )
         );

我使用QueryDsl版本3.7.2。

我唯一做的就是替换StringTemplate.create()函数 通过Expressions.stringTemplate()函数。

要完成,我已经在Java代码的开头定义了所有后续的QueryDsl导入。

import com.mysema.query.jpa.impl.JPAQuery;
import com.mysema.query.jpa.sql.JPASQLQuery;
import com.mysema.query.sql.OracleTemplates;
import com.mysema.query.sql.SQLTemplates;
import com.mysema.query.support.Expressions;
import com.mysema.query.types.expr.BooleanExpression;
import com.mysema.query.types.path.StringPath;