这两天遇到一个bug,写的testcase在本地没错,到CI上就报错。查了一下log,发现原因是本地跑testcase时hijack了配置文件,注释掉了以下这句
login.setShouldBindAllParameters(true);
这样让Toplink不使用参数绑定,比较方便查看输出的SQL,而CI上使用了参数绑定,所以出问题了
不使用参数绑定时,输出是这样的SQL,没有问题
SELECT trunc(t.create_time, 'DD') ta, COUNT(0) cnt
FROM ts_task t
GROUP BY trunc(t.create_time, 'DD')
使用参数绑定时,'DD'被绑定了,,相当于以下SQL
SELECT trunc(t.create_time, :1
) ta, COUNT(0) cnt
FROM ts_task t
GROUP BY trunc(t.create_time, :2
)
这样即使:1和:2 都绑定相同的'DD',但Oracle并不会发现这个信息,从而报了
ORA-00979: not a GROUP BY expression
其实,如果Toplink能够比较绑定参数,把相同的参数归为一个占位符,从而生成以下SQL,那么还是可以用绑定还是可以的
SELECT trunc(t.create_time, :1
) ta, COUNT(0) cnt
FROM ts_task t
GROUP BY trunc(t.create_time, :1
)
遗憾的是,至少在Toplink 10.1.3中还没有实现此功能。
最后的解决方法嘛,在ReportQuery一级使用了setShouldBindAllParameters(false)方法。这付出了执行计划不能重用的代价(因为Oracle是将整个SQL statement和SGA中缓存的执行计划作文本匹配的,这样换了后每换一个条件都要重新分析,缓存基本没用了),不过我也没想到更好的办法了
分享到:
相关推荐
为数不多的TopLink中文文档,珍惜啊 为数不多的TopLink中文文档,珍惜啊 为数不多的TopLink中文文档,珍惜啊
Oracle Toplink JPA
toplink mysql5 开发工具:Eclipse3.3 for J2ee 简要过程(先导好mysqlJDBC包和toplink包,进mysql建好数据库), 1.新建pojo类,加入Annotation 2.在src目录下建META-INF目录,写好persistence.xml文件 3.写测试类 自动...
介绍toplink的. 主要是toplink的基本概念,高级知识
toplink-essentials.jar toplink-essentials.jar
toplink-api.jar、 toplink-api.jar
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 toplink-api.jar,toplink-essentials.jar
toplink 和spring 集成包
toplink jpa的中文注解参考,虽然老了一点基本上还是很有用的。 原来下载的一个兄弟的chm,里面的锚链接有问题,反编译后修改了链接,并且保留html格式,使用更方便。
不用说了吧 大家都知道
This book introduces the basic concepts and principle for Oracle TopLink. It is suitable for the beginners for ORM and Java cache persistence purposes.
toplink-essentials-agent.jar
javaee实现jpa的toplink相关jar包。完整版。
This article introduces the concepts of Oracle TopLink Grid--used for Oracle Coherence (In Memory Data Grid).
Oracle Toplink Getting Started introduce some basic concepts of Oracle TopLink software.
是位居第一的Java 对象关系持久性体系结构
JavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源代码 spring-toplinkJavaEE源...
myeclipse_jpa_toplink.swf