[英]How can I set that a Spring Data JPA query method have to be a parameter value always set as true?
[英]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.