锁定老帖子 主题:准备发布Jert的第一个版本
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-01-27
Quake Wang 写道 基本的操作说明
2. 如何创建报表 在创建好数据库以后,我们就可以开始添加需要的报表。 选择Administration -> Reports -> Create New 目前共有3种报表类型可以选择: A. STATIC_QUERY 静态的sql query报表,用户不需要对该报表做输入参数的动作,我们可以直接输入任意的sql,比如:select * from user。 B. SIMPLE_PARAMETER_QUERY 简单固定参数报表,用户需要对该报表做输入参数的动作以后,才能得到查询结果,比如:select * from user where age > #age#。在这里参数名需要用“#”包围起来。 C. DYNAMIC_PARAMETER_QUERY 动态的非固定参数报表,根据用户输入参数的不同,产生不同的查询语句,比如: <plain>select * from user where 1 = 1 </plain> <dynamic type="isNotNull" append-before="and age > " parameter-name="age"/> <dynamic type="isNotNull" append-before="and sex = " parameter-name="sex"/> 当用户只输入age这个参数的时候,会产生这样的查询: select * from user where 1 = 1 and age > 18 当用户输入了age和sex这2个参数的时候,则会产生这样的查询: select * from user where 1 =1 and age > 18 and sex = 'male' 关于这种类型的报表详细说明,请参考dynamic_report.txt [TODO] 提几个建议: 1.SQL的参数设置没有必要搞得这么复杂,像 where 1 =1 这样的形式也不大雅观. 其实只是个SQL技巧的问题,对于你所说的动态的非固定参数查询,只需要用下面的SQL就可达到同样的功能: select * from user where (age > #age# or #age# isnull) and (sex = #sex# or #sex# isnull) 2.在实现时使用preparedStatment,用'?' 代替 #XXX#的内容,有利于SQL的执行性能,也可减少实现程序的复杂程度. |
|
返回顶楼 | |
发表时间:2005-01-27
Tao 写道 1.SQL的参数设置没有必要搞得这么复杂,像 where 1 =1 这样的形式也不大雅观. 其实只是个SQL技巧的问题,对于你所说的动态的非固定参数查询,只需要用下面的SQL就可达到同样的功能: select * from user where (age > #age# or #age# isnull) and (sex = #sex# or #sex# isnull) 嗯,我也觉得这种动态sql查询目前写起来极其不友好,但是想不出有什么好方法可以改进。 你说的这种方法我看不明白,如果用户在页面上只输入了age = 18,而 sex留空,那么翻译出来的sql是什么呢: select * from user where (age > 18 or 18 is null) and (sex = ??? or ??? is null) 这部分的使用,准备等用户反馈,再来做改进,可能格式会推倒,重新实现。 Tao 写道 2.在实现时使用preparedStatment,用'?' 代替 #XXX#的内容,有利于SQL的执行性能,也可减少实现程序的复杂程度. 现在就是这样做的呀 |
|
返回顶楼 | |
发表时间:2005-01-27
翻译出来的sql是个样子的:
select * from user where (age > ? or ? isnull) and (sex = ? or ? isnull) 有代码的话会是这样 public ResultSet getResultSet(Connection con,Map params);throws SQLException{ System.out.println("DataSetImpl:getResultSet:params=" + params); ; String sqlExpress=makeExpress();; PreparedStatement ps=con.prepareStatement(sqlExpress);; String[] names=this.getParamNames();; for(int i=0;i<names.length ;i++);{ DataSetParam dsp=getParam(names[i]);; ps.setObject(i+1,params==null ? null : params.get(names[i]);,dsp.getSqlType(););; } return ps.executeQuery();; } |
|
返回顶楼 | |
发表时间:2005-01-27
where (age > 18 or 18 is null)是不合法的sql语句吧?
另外如果用户只输入age,而没有输入sex,但是PreparedStatment要求占位符号和输入参数是一样多的,你还得去除掉sex条件的这部分语句,如何处理呢? |
|
返回顶楼 | |
发表时间:2005-01-27
Quake Wang 写道 where (age > 18 or 18 is null)是不合法的sql语句吧?
另外如果用户只输入age,而没有输入sex,但是PreparedStatment要求占位符号和输入参数是一样多的,你还得去除掉sex条件的这部分语句,如何处理呢? 1.where (age > 18 or 18 is null)是不合法的sql语句,但where (age > ? or ? is null)是符合JDBC规范的语法 2.不需要除掉sex条件的这部分语句,直接传空值就可以了 |
|
返回顶楼 | |
发表时间:2005-01-27
真得很奇妙:
PreparedStatement ps = conn.prepareStatement("select * from user where (user_name = ? or ? is null); and (email = ? or ? is null);");; ps.setObject(1, null);; ps.setObject(2, null);; ps.setObject(3, null);; ps.setObject(4, null);; 竟然查询出来的结果是和select * from user 是一样的,从来不知道jdbc有这样的特性,我先去看一下jdbc的这部分规范,再来看看如何改进。 谢谢你,Tao |
|
返回顶楼 | |
发表时间:2005-01-28
两个null is null,where子句当然返回true啦
|
|
返回顶楼 | |
发表时间:2005-01-28
在war中增加logs/application.log,以支持登记webwork相关出错/警告日志。
|
|
返回顶楼 | |
发表时间:2005-01-28
奇怪,我把jer.war copy到resin2.1.4下面,运行http://localhost:8080/jert/setup/index.action
出现如下错误: -------------------------------------------------------- 500 Servlet Exception org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [com/javaeye/jert/application_context.xml]: Initialization of bean failed; nested exception is net.sf.hibernate.MappingException: org.dom4j.DocumentException: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation Nested exception: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation net.sf.hibernate.MappingException: org.dom4j.DocumentException: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation Nested exception: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:296) at org.springframework.orm.hibernate.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:383) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:990) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:275) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:193) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:240) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:163) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:230) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:304) at org.springframework.web.context.support.XmlWebApplicationContext.refresh(XmlWebApplicationContext.java:131) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:167) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:101) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:48) at com.caucho.server.http.Application.init(Application.java:1838) at com.caucho.server.http.VirtualHost.startApplication(VirtualHost.java:1192) at com.caucho.server.http.VirtualHost.getInvocation(VirtualHost.java:991) at com.caucho.server.http.ServletServer.getInvocation(ServletServer.java:1189) at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:218) at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163) at com.caucho.server.TcpConnection.run(TcpConnection.java:137) at java.lang.Thread.run(Thread.java:534) Caused by: org.dom4j.DocumentException: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation Nested exception: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation at org.dom4j.io.SAXReader.read(SAXReader.java:358) at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:286) ... 20 more -------------------------------------------------------------------------------- Resin 2.1.4 (built Fri Aug 2 14:16:52 PDT 2002) |
|
返回顶楼 | |
发表时间:2005-01-28
Resin使用它自己的一个xml parser,速度快,但是不是所有的功能都实现,你可以写一个启动脚本:
httpd -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl 让它使用xerces的parser,这样应该就可以正常运行了。 另外,如果有使用上的问题,bug report,建议。可以用CVSTrac来填写: http://cvs.iteye.com:8008/quake/index 谢谢。 |
|
返回顶楼 | |