一个数据库查询方法(可以动态设置查询参数,设置查询条件),很巧妙的组合sql语句
2009-09-27 18:07
1126 查看
public <T> QueryResult<T> getScrollData(Class<T> entityClass,String wherejpql,Object[] queryParams,
int firstindex, int maxResult, LinkedHashMap<String, String> orderby) {
// for(int i = 0;i<queryParams.length;i++){
// System.out.println("=================queryParams is " + i +queryParams[i]);
// }
String entityName = getEntityName(entityClass);
QueryResult qr = new QueryResult<T>();
String sql = "select o from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql) + buildOrderby(orderby);
Query query = em.createQuery(sql);
setQueryParams(query,queryParams);
System.out.println("-------------------in DaoSupport :sql is:" + sql);
/**
* 1:查询的时候第一步查询到的都是数据表里所有的记录
* 2:再用query.setFirstResult(firstindex).setMaxResults(maxResult)
* 方法来设置要显示的首记录(即从哪一条开始显示)和要显示的记录条数
* 3:然后保存相关数据,方便前台页面显示
*/
if(firstindex != -1 && maxResult != -1){
query.setFirstResult(firstindex).setMaxResults(maxResult);
}
qr.setResultList(query.getResultList());
/**
* 这里的记录数不是要显示的记录有多少条,而是数据表里一共有多少条记录
*/
query = em.createQuery("select count(o) from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql));
setQueryParams(query,queryParams);
qr.setTotalrecord((Long)query.getSingleResult());
return qr;
}
/**
* 构建order by 语句
* orderby 语句格式:order by key1 asc,key2 asc
* @param orderby
* @return
*/
protected String buildOrderby(LinkedHashMap<String, String> orderby){
StringBuffer orderbySql = new StringBuffer("");
if(orderby !=null && orderby.size()>0){
orderbySql.append(" order by ");
//order by key1 desc,key2 asc
for(String key:orderby.keySet()){
orderbySql.append(key).append(" ").append(orderby.get(key)).append(",");
}
orderbySql.deleteCharAt(orderbySql.length() - 1);
}
return orderbySql.toString();
}
/**
* 给where语句设置参数值
* wherejpql 语句格式:where o.property=?1,o.property=?2。
* @param query
* @param params
*/
protected void setQueryParams(Query query,Object[] params){
if(params != null && params.length > 0){
for(int i=0;i<params.length;i++){
//System.out.println("i+1 = " + (i+1) + " params[i] " + params[i] );
query.setParameter(i+1, params[i]);
}
}
}
QueryResult.java:
package com.itcast.util;
import java.util.List;
public class QueryResult<T>{
private List<T> resultList;
private long totalrecord;
public List<T> getResultList() {
return resultList;
}
public void setResultList(List<T> resultList) {
this.resultList = resultList;
}
public long getTotalrecord() {
return totalrecord;
}
public void setTotalrecord(long totalrecord) {
this.totalrecord = totalrecord;
}
}
int firstindex, int maxResult, LinkedHashMap<String, String> orderby) {
// for(int i = 0;i<queryParams.length;i++){
// System.out.println("=================queryParams is " + i +queryParams[i]);
// }
String entityName = getEntityName(entityClass);
QueryResult qr = new QueryResult<T>();
String sql = "select o from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql) + buildOrderby(orderby);
Query query = em.createQuery(sql);
setQueryParams(query,queryParams);
System.out.println("-------------------in DaoSupport :sql is:" + sql);
/**
* 1:查询的时候第一步查询到的都是数据表里所有的记录
* 2:再用query.setFirstResult(firstindex).setMaxResults(maxResult)
* 方法来设置要显示的首记录(即从哪一条开始显示)和要显示的记录条数
* 3:然后保存相关数据,方便前台页面显示
*/
if(firstindex != -1 && maxResult != -1){
query.setFirstResult(firstindex).setMaxResults(maxResult);
}
qr.setResultList(query.getResultList());
/**
* 这里的记录数不是要显示的记录有多少条,而是数据表里一共有多少条记录
*/
query = em.createQuery("select count(o) from "+entityName+" o " + (wherejpql==null?"":"where " + wherejpql));
setQueryParams(query,queryParams);
qr.setTotalrecord((Long)query.getSingleResult());
return qr;
}
/**
* 构建order by 语句
* orderby 语句格式:order by key1 asc,key2 asc
* @param orderby
* @return
*/
protected String buildOrderby(LinkedHashMap<String, String> orderby){
StringBuffer orderbySql = new StringBuffer("");
if(orderby !=null && orderby.size()>0){
orderbySql.append(" order by ");
//order by key1 desc,key2 asc
for(String key:orderby.keySet()){
orderbySql.append(key).append(" ").append(orderby.get(key)).append(",");
}
orderbySql.deleteCharAt(orderbySql.length() - 1);
}
return orderbySql.toString();
}
/**
* 给where语句设置参数值
* wherejpql 语句格式:where o.property=?1,o.property=?2。
* @param query
* @param params
*/
protected void setQueryParams(Query query,Object[] params){
if(params != null && params.length > 0){
for(int i=0;i<params.length;i++){
//System.out.println("i+1 = " + (i+1) + " params[i] " + params[i] );
query.setParameter(i+1, params[i]);
}
}
}
QueryResult.java:
package com.itcast.util;
import java.util.List;
public class QueryResult<T>{
private List<T> resultList;
private long totalrecord;
public List<T> getResultList() {
return resultList;
}
public void setResultList(List<T> resultList) {
this.resultList = resultList;
}
public long getTotalrecord() {
return totalrecord;
}
public void setTotalrecord(long totalrecord) {
this.totalrecord = totalrecord;
}
}
相关文章推荐
- 多条件查询--使用dapper命令参数动态拼接出最安全的sql语句
- 当只有一个输入条件的时匹配数据库表中多个字段模糊查询的SQL语句
- [转][SQL]如何实现存储过程中动态加入条件---没想到语句可以这么巧妙
- 使用SQL查询语句时,数组动态赋值SQL IN ()作为条件条件一个
- 使用SQL查询语句时,数组动态赋值SQL IN ()作为条件条件一个
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 数据库查询速度优化 2 优化SQL语句方法
- javascript:设置URL参数的方法,适合多条件查询
- 简单高效防注入攻击的动态多参数、动态SQL语句拼接方法,提高网站的安全性
- SQL高级语句-SQL 通配符-在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。
- Hibernate_根据条件动态组装sql/hql语句(仿ibatis动态查询语句功能)
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件
- 怎样用SQL语句查询一个数据库中的所有表?
- hibernate根据条件动态组装sql/hql语句(仿ibatis动态查询语句功
- MySQL中根据if标签实现多条件模糊查询(动态SQL语句)
- ASP.NET 多条件动态参数查询方法
- SqlServer 巧妙解决 多条件组合查询(只是一个很好的想法,但它不会走索引)所以效率不好
- Linq to sql 实现多条件的动态查询(方法一)
- asp.net sql语句中where条件存在中文在程序中取不出数据,在数据库中可以正常取值,数据库为oracle
- 根据参数指定的列名和值查询员工信息(使用动态sql语句)