hibernate -- HQL语句总结

1. 查询整个映射对象所有字段

//直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users";

Query query = session.createQuery(hql);

List<Users> users = query.list();

for(Users user : users){

System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());

}

输出结果为:

name1 : password1 : 1

name2 : password2 : 2

name3 : password3 : 3

2.查询字段

//查询其中几个字段

String hql = " select name,passwd from Users";

Query query = session.createQuery(hql);

//默认查询出来的list里存放的是一个Object数组

List<Object[]> list = query.list();

for(Object[] object : list){

String name = (String)object[0];

String passwd = (String)object[1];

System.out.println(name + " : " + passwd);

}

输出结果为:

name1 : password1

name2 : password2

name3 : password3

3.修改默认查询结果(query.list())不以Object[]数组形式返回,以List形式返回

//查询其中几个字段,添加new list(),注意list里的l是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是List集合了

String hql = " select new list(name,passwd) from Users"; Query query = session.createQuery(hql);

//默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是List集合了

List<List> list = query.list();

for(List user : list){

String name = (String)user.get(0);

String passwd = (String)user.get(1);

System.out.println(name + " : " + passwd);

}

/**

输出结果为:

name1 : password1

name2 : password2

name3 : password3

*/

4.修改默认查询结果(query.list())不以Object[]数组形式返回,以Map形式返回

//查询其中几个字段,添加new map(),注意map里的m是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是map集合了

String hql = " select new map(name,passwd) from Users"; Query query = session.createQuery(hql);

//默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是Map集合了

List<Map> list = query.list();

for(Map user : list){

//一条记录里所有的字段值都是map里的一个元素,key是字符串0,1,2,3....,value是字段值

// 如果将hql改为:String hql = " select new map(name as username,passwd as password) from Users";,那么key将不是字符串0,1,2...了,而是"username","password"了

String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形

String passwd = (String)user.get("1");

System.out.println(name + " : " + passwd);

}

/**

输出结果为:

name1 : password1

name2 : password2

name3 : password3

*/

5.修改默认查询结果(query.list())不以Object[]数组形式返回,以自定义类型返回

6.条件查询

//条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数

String hql = "from Users where name=? and passwd=?"; Query query = session.createQuery(hql);

//第1种方式

// query.setString(0, "name1");

// query.setString(1, "password1");

//第2种方式

query.setParameter(0, "name1",Hibernate.STRING); query.setParameter(1, "password1",Hibernate.STRING); List<Users> list = query.list();

for(Users users : list){

System.out.println(users.getId());

}

//条件查询,自定义索引名(参数名):username,:password.通过

setString,setParameter设置参数

String hql = "from Users where name=:username and

passwd=:password";

Query query = session.createQuery(hql);

//第1种方式

// query.setString("username", "name1");

// query.setString("password", "password1");

//第2种方式,第3个参数确定类型

query.setParameter("username", "name1",Hibernate.STRING); query.setParameter("password",

"password1",Hibernate.STRING);

List<Users> list = query.list();

for(Users users : list){

System.out.println(users.getId());

}

//条件查询,通过setProperties设置参数

String hql = "from Users where name=:username and

passwd=:password";

Query query = session.createQuery(hql);

//MyUser类的2个属性必须和:username和:password对应 MyUser myUser = new MyUser("name1","password1"); query.setProperties(myUser);

List<Users> list = query.list();

for(Users users : list){

System.out.println(users.getId());

}

7.update 数据

执行SQL语句(为什么要用SQL语句,我想是为了执行某些复杂的SQL语句吧)

String sql="update Table set field = 'test'"

Session session = HibernateSessionFactory.getSession();

session.createSQLQuery(sql).executeUpdate();

ts.commit();

执行HQL语句

String hql="update Table set field = 'test'"

Session session = HiberanteSessionFactory.getSession();

Transaction ts = session.beginTransaction();

Query query = session.createQuery(hql);

query.executeUpdate();

ts.commit();

 

第二篇:hibernate执行sql语句的总结

下面看个示例: public List<Menu> findMenusByEntityTypeId(Long id) {

String hql = "select m.id as {menu.id},m.name as {menu.name},m.url as {menu.url},m.icon_url as {menu.iconUrl},m.parent_id as {menu.parentId},"

+"m.serial_number as {menu.serialNo},m.admin as {menu.adminUse},m.system_admin as {menu.systemAdmin} ,m.program_name as {menu.programName}"

+" from menu m, entity_type et, entity_admin_menu eam"

+" where et.id = "+id+""

+" and m.program_name = '"+GlobalNames.PROGRAM_NAME_CHSS+"'"

+" and et.id = eam.entity_id"

+" and m.id = eam.menu_id";

List<Menu>

nu",Menu.class).list();

return menus;

}

1.通过addEntity("menu",Menu.class),通过addEntity把要返回的数据强转为Menu,注意Menu必须要是配置hibernate映射了的。m.id as {menu.id},这是为了如果数据库字段名和Menu模型中不一样所以都as取了个别名,那么这样就能返回menu对象了。

2、如果要执行的sql语句是多表查询,并且是返回一个对象。但是这个对象是没有配置hibernate映射的。这种就麻烦了。hibernate执行SQL默认返回的是一个object类型的数组,

List menus

=super.getSessionFactory().getCurrentSession().createSQLQuery(hql).list();

for(int i=0;i<menus .size();i++)

{Object[] objects = (Object[])menus .get(i);for(int j=0;j<objects.length;j++) {System.out.println(objects[j].getClass().getName());}

运行后报错:java.lang.ClassCastExceptionjava.lang.Object; cannot be cast to

net.greatsoft.chss.domain.privilege.model.Menu,原来是查询出来的字段并不能自动转换为bean对象,所以要添加addEntity(Clazz class)。有人肯定会说添加addEntity了,但是如果Menu没有添加hibernate映射的话,此时会报Menu unmapping。。。。。。就是没添加映射,

所以只能添加setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一个map,KEY:为DB中名称一致(大小写一致)遍历list时就可以。所以只能将返回的值变成Map,这样就好操作了,然后就可用反射取值了,详细看:hibernate 执行sql语句返回自定义对象

3、hibernate 中createQuery与createSQLQuery两者区别是:

前者用的hql语句进行查询,后者可以用sql语句查询

前者以hibernate生成的Bean为对象装入list返回,后者则是以对象数组进行存储

所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很menus = super.getSessionFactory().getCurrentSession().createSQLQuery(hql).addEntity("me

方便

突然发现createSQLQuery有这样一个方法可以直接转换对象

Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);

XXXXXXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。但是这个bean必须有映射

呵呵以后多注意,还是时不时的要看看hibernate各个对象方法的使用.

 

第三篇:Better late than never

Better late than never

Good morning, dear professors. It’s my honour to have a speech here. Well, my speech is ahout “Better late than never”.

When I was young, my English was very poor. Every time I saw my classmates speaking English fluently and smoothly, I was always jealous of them , felt sad, and even didn’t want to study English any more. One day, my mother told me, “your classmates’ English is better than you, due to their keeping effort. Now, please study hard and never give it up . I’m sure you will speak English as well as they do some day.Better late than never, persevere and you’ll succeed!”

From then on , I began to struggle in English. “Whenever I want to give it up, “Better late than never” always encourages me to go on. In this way, my English is getting better and better, resulting in much confidence in myself. That’s why I will join in this competition and stand here to have a speech.

Now, I deeply understand the words “better late than never.”

Thank you all !

相关推荐