繁体   English   中英

我有PIVOT时,使用JPA如何在本机查询中设置参数

[英]using JPA how to set parameter in native query when I have PIVOT

   q = createQuery( "  select * from ( ( SELECT * FROM ( SELECT dt.route_id , dt.amount , dc.card_type_id FROM DDRC_TRANS\n" +
                "dt , DDRC_CARD dc WHERE ( dt.card_id = dc.id AND dt.insert_time >= ('02-JAN-2000 04:00:00 AM')\n" + 
                "AND dt.insert_time <= ('02-FEB-2050 04:00:00 AM') AND dt.route_id IN ( '1', '3' ) ) ) PIVOT\n" + 
                "( SUM(amount ) FOR card_type_id IN ( 1,2,3 ) ) ) )"
                , clazz);

好的,一切看起来都不错! 我可以运行此查询,它也返回结果!

但是我发现了一个问题。 如果需要设置参数怎么办? 例如这样

 q = createQuery( "  select * from ( ( SELECT * FROM ( SELECT dt.route_id , dt.amount , dc.card_type_id FROM DDRC_TRANS\n" +
                "dt , DDRC_CARD dc WHERE ( dt.card_id = dc.id AND dt.insert_time >= ('02-JAN-2000 04:00:00 AM')\n" + 
                "AND dt.insert_time <= ('02-FEB-2050 04:00:00 AM') AND dt.route_id IN ( '1', '3' ) ) ) PIVOT\n" + 
                "( SUM(amount ) FOR card_type_id IN ( :param ) ) ) )"
                , clazz);


         List<String> valueList = Arrays.asList("1,2,3");
         q.setParameter("param", valueList);

现在这里我有这种类型的错误:

java.sql.SQLException: ORA-56900: bind variable is not supported inside pivot|unpivot operation

为什么? 我怎样才能解决这个问题? 这是休眠的BUG吗?

问题似乎是ojdbc不允许在PIVOT子句中绑定变量,因为它不受支持

您发布的第一个查询以显式方式设置值。 在第二个,你是间接使用preparedStatement时通过JPA提供商。 这就是为什么您最终得到一个如下所示的查询语句的原因,该语句不受支持(请注意IN子句的参数化值)

select * .... PIVOT ( SUM(amount ) FOR card_type_id IN ( ? ) ) ) ) 

尽管无论如何它都行不通,但您必须知道您没有设置值列表 在上面的查询中,您只需设置一个参数。

对于本机查询(假设您正在createQuery方法中使用EntityManager.createNativeQuery创建),

q = createQuery( "select * .... card_type_id IN ( :param ) ");
List<String> valueList = Arrays.asList("1,2,3");
q.setParameter("param", valueList);

最终生成的内容取决于JPA提供程序如何用valueList替换:param ,但这只是一个参数替换而不是列表。 例如,Hibernate会生成一个preparedStatement时这样

select * .... card_type_id IN ( ? )

设置了valueList参数后,最终采用下一种形式

select * .... card_type_id IN ( [1,2,3] )

您真正应该实现的是这样的prepareStatement(请注意许多参数?

select * .... card_type_id IN ( ?,?,? )

为此, valueList应该如下所示:

List<String> valueList = Arrays.asList("1","2","3");

然后,该语句将采用上述内容,并最终完成:

select * .... card_type_id IN ( '1','2','3' )

您不能将List作为参数传递给JDBC。 您必须传递各个值并具有多个“?” 在声明中。 除此之外,您还可以使用正在使用的特定JDBC驱动程序的规则,以及该规则接受要使用的参数的位置。 所有JDBC驱动程序都限制可以以一种或另一种方式应用参数的位置...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM