使用此动态查询方法,不用每次都为一个带参的hibernate查询写一个查询,只需要用map传递参数即可,传递的参数map.key名必须与领域模型的属性名一致,如果不一致,则不会应用查询参数;多表连接查询等复杂推荐使用ibatis,但是使用hibernate最好设置为对象间关联,就可以在hibernate内事务内解决问题,不然事物配置很麻烦;
第一个为获取类的属性名的静态工具方法
第二个为动态查询方法,可写在抽象基类
余下为调用的示例方法
此代码写的粗糙,有不足及纰漏,望大家及时更贴斧正
package ly.tool.utils.ref;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
import org.apache.log4j.Logger;
import com.jhzp.domain.Userinfo;
import com.jhzp.domain.base.BaseDomain;
public class ReflectUtils {
private static Logger log=Logger.getLogger(ReflectUtils.class);
public static void main(String[] args) throws IntrospectionException{
System.out.println(listPropNames( Userinfo.class));;
}
/**
* 获取领域属性名列表
*/
public static List<String> listPropNames(Class clazz) {
List<String> pnamel=new ArrayList<String>();
BeanInfo bi;
try {
bi = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (int i = 0; i < pds.length; i++) {
String propName = pds[i].getName();
pnamel.add(propName);
}
return pnamel;
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
/**
* hibernate 动态参数查询 ,查询参数形式只能是: name=:name,
* 其他形式的查询使用自定义hql的查询queryByParamAndHql
*/
protected List queryByParam(org.hibernate.Session session,Class dclazz,Map<String,Object> params){
List<String> fnamel=ReflectUtils.listPropNames(dclazz);
Set<String> pnames=params.keySet();
List<String> pnamel=new ArrayList<String>();
Iterator<String> iter=pnames.iterator();
while(iter.hasNext()){
String pname=iter.next();
if(null!=params.get(pname) && fnamel.contains(pname)){
pnamel.add(pname);
}
}
String hql="from "+dclazz.getSimpleName();
if(pnamel.size()>0){
hql=hql+" where ";
}
StringBuilder sdb=new StringBuilder();
sdb.append(hql);
int count=0;
for(String pname:pnamel){
if(!fnamel.contains(pname)){
log.info(" pname: "+pname+"参数跟属性名不同,返回了,fnamel列表: "+fnamel);
return null;
}
if(count>0){
sdb.append(" and "+ pname+" = :"+pname);
}else
sdb.append(pname+" = :"+pname);
count++;
}
hql=sdb.toString();
log.info("打印生成的hql: "+hql);
Query query=session.createQuery(hql);
for(String pname:pnamel){
Object obj=params.get(pname);
if(obj instanceof String){
query.setParameter(pname, obj);
}else if(obj instanceof BigDecimal){
query.setBigDecimal(pname, ((BigDecimal)obj));
}else if(obj instanceof BigInteger){
query.setBigInteger(pname, ((BigInteger)obj));
}else if(obj instanceof Boolean){
query.setBoolean (pname, ((Boolean)obj));
}else if(obj instanceof Byte){
query.setByte(pname, ((Byte)obj));
}else if(obj instanceof Calendar){
query.setCalendar(pname, ((Calendar)obj));
}else if(obj instanceof Date){
log.info("应用到了"+Date.class);
query.setDate(pname, ((Date)obj));
}else if(obj instanceof Double){
query.setDouble(pname, ((Double)obj));
}else if(obj instanceof Integer){
query.setDouble(pname, ((Integer)obj));
}else if(obj instanceof Locale){
query.setLocale(pname, ((Locale)obj));
}else if(obj instanceof Long){
query.setLong(pname, ((Long)obj));
}else{
query.setParameter(pname, obj);
}
}
/**
* 自定义hql,传递动态的参数
*/
protected List queryByParamAndHql(Session session,String hql,Map<String,Object> params){
Query query=session.createQuery(hql);
for(String pname:params.keySet()){
if(hql.contains(pname)){
Object obj=params.get(pname);
if(obj instanceof String){
query.setParameter(pname, obj);
}else if(obj instanceof BigDecimal){
query.setBigDecimal(pname, ((BigDecimal)obj));
}else if(obj instanceof BigInteger){
query.setBigInteger(pname, ((BigInteger)obj));
}else if(obj instanceof Boolean){
query.setBoolean (pname, ((Boolean)obj));
}else if(obj instanceof Byte){
query.setByte(pname, ((Byte)obj));
}else if(obj instanceof Calendar){
query.setCalendar(pname, ((Calendar)obj));
}else if(obj instanceof Date){
log.info("应用到了"+Date.class);
query.setDate(pname, ((Date)obj));
}else if(obj instanceof Double){
query.setDouble(pname, ((Double)obj));
}else if(obj instanceof Integer){
query.setDouble(pname, ((Integer)obj));
}else if(obj instanceof Locale){
query.setLocale(pname, ((Locale)obj));
}else if(obj instanceof Long){
query.setLong(pname, ((Long)obj));
}else{
query.setParameter(pname, obj);
}
}
}
try {
return query.list();
} catch (Exception e) {
e.printStackTrace();
log.error("第二查询出错了。");
return null;
}
}
/**
* 被service调用代码片段:
* /
@Transactional(readOnly=true)
public List<Statistics> listStatistics(Map<String,Object> params) throws SQLException{
return super.queryByParam(super.getHibernateSession(), Statistics.class, params);
}
@Transactional(readOnly=true)
public List<Statistics> listStatistics2(Date date) throws SQLException{
String hql="from Statistics where atday =:atday";
Query query=super.getHibernateSession().createQuery(hql);
query.setDate("atday", date);
return query.list();
}
/**
* 被control调用代码片段
*/
@RequestMapping(value="/tss/stc/listsaleno.html", method=RequestMethod.GET)
public String listsaleno(HttpServletRequest hreq,ModelMap mm) throws SQLException{
Map<String,Object> params=new HashMap<String,Object>();
params.put("stype", "no");
params.put("atday", new Date());
List<Statistics> stcl= this.sts.listStatistics(params);
mm.addAttribute("stcl", stcl);
mm.addAttribute("stype", "no");
return "tss/stc/stcs";
}
/**
* client 调用
*/
public static void main(String[] args) throws Exception {
Calendar calendar = Calendar.getInstance();
StatisticsTask task = (StatisticsTask) act.getBean("statisticsTask");
StatisticsService sts=(StatisticsService) act.getBean("statisticsService");
Map<String,Object> params=new HashMap<String,Object>();
params.put("stype", "uc");
params.put("atday", calendar.getTime());
String hql="from Statistics where atday <:atday and stype=:stype";
List<Statistics> stcl=sts.hlistStatisticsByHql(hql, params);
log.info("统计的长度:"+stcl.size());
}
分享到:
相关推荐
在执行`Query.list`查询时,Hibernate会创建一个Query Key,包括SQL语句、查询参数和分页条件。如果在缓存中找到匹配的Query Key,它将直接返回缓存的结果列表,否则会从数据库中获取新数据,并将其存入缓存。注意,...
标题和描述均聚焦于“Hibernate查询详解”,这一主题在IT领域尤其是Java开发中至关重要,因为Hibernate作为一款流行的Java持久层框架,提供了丰富的查询机制,帮助开发者高效地与数据库交互。以下将深入探讨...
- **单个参数查询** ```java List<User> find(String queryString, Object value); // 示例:List<User> users = this.getHibernateTemplate().find("from bean.User u where u.name=?", "test"); ``` - **模糊...
**Hibernate** 是一个面向 Java 领域的持久化框架,它属于 ORM(Object-Relational Mapping,对象关系映射)的一种实现方式。所谓“持久化”,通常指的是将程序运行时的数据状态保存至磁盘等持久性存储设备的过程,...
2.4.5. 关于单个关联关系的注解 2.4.5.1. 延迟选项和获取模式 2.4.6. 关于集合类型的注解 2.4.6.1. 参数注解 2.4.6.2. 更多的集合类型 2.4.7. 缓存 2.4.8. 过滤器 2.4.9. 查询 3. 通过XML覆写元数据 3.1. 原则...
Hibernate作为Java领域中流行的ORM(对象关系映射)框架,提供了丰富的注解来简化实体类与数据库表之间的映射。本文将深入解析一系列关键注解,帮助理解Hibernate如何实现这一过程。 #### 1. `@Entity`与`@Table` ...
- **2.4.8 过滤器**:`@Filter` 注解用于实现对查询结果的动态过滤。 - **2.4.9 查询**:`@NamedQuery` 注解用于定义命名查询。 #### 四、通过 XML 覆写元数据 尽管使用注解可以方便地配置 Hibernate,但在某些情况...
在IT领域,尤其是在Java开发中,Hibernate是一个非常流行的Object-Relational Mapping (ORM)框架,它简化了数据库操作,使得开发者可以用Java对象的方式来处理数据库事务。然而,有时我们需要执行更复杂的SQL任务,...
Hibernate,作为Java领域中的一个著名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而非繁琐的数据处理。本次我们将深入探讨Hibernate 4.2.19.Final版本,这一稳定且广泛使用...
在IT领域,尤其是企业级应用开发中,Hibernate作为一款流行的ORM(Object Relational Mapping)框架,被广泛应用于Java应用程序中,用于简化数据持久化层的开发工作。然而,当涉及到大量数据的批量处理时,Hibernate...
- **参数注解:** 如`@ElementCollection`用于映射元素集合。 - **更多的集合类型:** 如`@MapKey`用于映射Map类型的键。 #### 六、通过XML覆写元数据 - **原则:** 可以通过XML文件来覆盖注解中定义的映射信息。...
在Java开发中,尤其是在Web应用领域,对数据库的高效查询及数据展示是非常重要的一个环节。其中分页查询是提高用户体验和减轻服务器压力的一种常见手段。Spring框架中的`HibernateDaoSupport`类提供了与Hibernate...
4. Query:用于执行HQL查询,支持参数化查询,返回结果可以是单个对象、集合或者数字。 五、Hibernate优势 1. 解耦:将Java对象与SQL语句分离,提高了代码的可读性和可维护性。 2. 自动类型转换:自动处理Java对象...
在Java开发领域,Hibernate是一个非常流行的Object-Relational Mapping(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。本篇文章将深入探讨Hibernate的通用Dao设计,...
Hibernate是Java领域中一款流行的持久化框架,它简化了数据库与Java对象之间的交互,使得开发者无需直接编写SQL语句,就能实现对数据库的操作。在本教程中,我们将深入探讨如何搭建一个基本的Hibernate开发环境,以...
- **参数注解**:使用 `@MapKey`、`@ElementCollection` 等注解来映射集合中的元素。 - **更多的集合类型**:`@OneToMany`、`@ManyToMany` 等注解用于更复杂的集合映射。 - **缓存**:使用 `@Cache` 注解来控制...
SSH2框架,即Struts2 + Spring2 + Hibernate2/3 的组合,是Java Web开发领域中一种非常流行的轻量级应用架构。在该框架下进行多表查询的单个模块开发时,通常涉及到实体类(Entity)、数据访问对象(DAO)、业务逻辑层...
无论是从简单的实体映射到复杂的关联关系管理,还是从查询优化到性能调优,Hibernate Annotations都展现出了其强大的功能和灵活性。对于开发者来说,熟练掌握这些知识点能够极大地提高开发效率,降低维护成本。
5. **动态查询**:Hibernate提供`Criteria` API和`DetachedCriteria`,它们可以构建动态的查询,避免硬编码HQL,提高代码的可读性和可维护性。 6. **命名查询**:预定义的HQL查询可以存储在持久化类的元数据中,...