Hibernate HQL语句使用

HQL语句概述

在这种查询语句中以java类名代替了sql语句中的表名;属性名代替表中的字段名,而且大小写敏感。

HQL被设计为完全面向对象的查询,可也理解继承,多态和关联子类的概念。

在HQL查询语句中可以使用sql聚合函数和表达式,使用语法一直,同样可以通过order by,g'roup by等子句对查询结果集进行排序和分组。

From字句

From User返回了User类中的所用实例,通常不需要使用类的全选定名。通常情况下需要指定别名,原因是在查询过程中的其他部分还会引用到User

from User user

Select子句

select cat.mate from Cat cat

选择将哪些属性返回到结果集中。

查询语句可以返回值为任何类型的属性,包括返回类型为某种组件的属性;

查询语句返回多个对象或者属性,存放在aiObject[]列表中,而且需要逐个书写列名,不能使用*号。

可以使用聚集函数有:avg、sum、min、max、count等。

Where字句

where字句允许你将返回的实例列表的范围缩小,入股哦没有制定别名,则你可以直接是哦那个属性名来引用属性。

from Cat where name=‘Frid’

指定别名:from Cat as cat where cat.name='Fritz'

from Cat as fatcat where fatcat.weight>(select avg(cat.weight) from DomesticCat cat)

在select泪飙中包括一个二标大叔以上的子查询,你可使用一个元组构造符:

from Cat as cat where (cat.name,cat.color) ont in (select cat.name,cat.color from DomesticCat cat)

 

先建立一个BasicDao.java的泛型接口:

public interface BasicDao<T> {
/**
 * 
 * @param t
 * @return
 */
	public boolean add(T t);

	public boolean update(T t);

	public boolean delete(Class cl,int id);
	
	public T queryById(Class cl,int id);
	
	public List<T> queryAll();
	
	public List<T> queryByLike(String str);

	public List<T> queryByPage(int page,int pagesize);

	public long  getCount();
	
}

之后建立BasicImple实现类,将每个接口方法实现,增删改查一系列方法,其中以下语句为关键代码,list为执行hql语句获取到的结果集。

Query query=session.createQuery(hql).setInteger("age",age);

List result=query.list();

在实现方法中想要实现其泛用性,需要在方法中将hql语句当作参数传入。

在接下来书写的方法中我们为了简便使用Person对象。

	public List<T> queryAll() {//查询所有数据
		
		String hql="from Person";
		
		Session session=HibernateUtil.getSession();
		Transaction tran=session.beginTransaction();
		Query query=session.createQuery(hql);
		List<T> list=query.list();
		tran.commit();
		return (List<T>) list;     
	}

Test.java:

BasicImpl<Person> personDao =new BasicImpl<Person>();
	 
	 		List<Person> list=personDao.queryAll();
	 		
	 		for(Person person:list)
	 		{
	 			System.out.println(person.getPname());
	 		
	 		}

hql语句中可以正常使用字符串拼接,但是setString时字符串从0开始进行拼接。

String hql="from Person  where pname like ?";
		Session session=HibernateUtil.getSession();
		Transaction tran=session.beginTransaction();
		Query query=session.createQuery(hql);
		query.setString(0,"%+str+%")
		List<T> list=query.list();
		tran.commit();
		return (List<T>) list;    

模糊查询方法:

public List<T> queryByLike(String str) {
		String hql="from Person  where pname like ?";	
		Session session=HibernateUtil.getSession();
		Transaction tran=session.beginTransaction();
		Query query=session.createQuery(hql);
		query.setString(0,"%"+str+"%");
		List<T> list=query.list();
		tran.commit();
		return (List<T>) list;    
	}

这时我们的增删改查方法大致成型,真正做项目的时候需要用到的更多的方法,需要在继承接口的同时进行拓展。

HQL语句大致和sql的写法上面差异不大,所有的操作通过泛型接口中的泛型对象方法,通过传递HQL语句和实例对象进行的。

发布了23 篇原创文章 · 获赞 10 · 访问量 1万+
展开阅读全文

Hibernate在那个方法里将HQL转成普通SQL语句并执行的?

08-24

Hibernate在那个方法里将HQL转成普通SQL语句并执行的? [b]问题补充:[/b] 小弟不才,根据各位的提示还是没能找到具体的转换方法在那里。 [b]问题补充:[/b] 昨天就是在研究这个类,我的修改如下。重编译后替换原来的class文件,运行程序看不到我加上去的打印。 private void generate(AST sqlAst) throws QueryException, RecognitionException { System.out.println("************generate begin"); if (this.sql == null) { SqlGenerator gen = new SqlGenerator(this.factory); gen.statement(sqlAst); System.out.println("--generate1"); System.out.println(gen.getSQL()); System.out.println("--generate2"); this.sql = gen.getSQL(); if (log.isDebugEnabled()) { log.debug("HQL: " + this.hql); log.debug("SQL: " + this.sql); } gen.getParseErrorHandler().throwQueryException(); } } [b]问题补充:[/b] 我写了个根据角色进行数据过滤的方法不能直接用的HQL上只能对原始的SQL语句加工,所以想得到Hibernate转换后的语句且在它进行查询之前将此语句加工,然后再让其执行 [b]问题补充:[/b] 我是新建一个项目在里面按hibernate里的结构建包名,然后把反编译后的类文件放到包下进行编译的。见附件图 [b]问题补充:[/b] 因为我的程序已经写好了,现要加入数据过滤的功能。只能这样改了。 想的太简单了是指hibernate并不是象我想的那样会输出个原始语句然后再执行吗? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览