hibernate使用from (select ……)子查询的方法
hibernate 条件查询的一些写法
hibernate 条件查询的一些写法默认分类 2010-09-28 22:14:38 阅读39 评论0 字号:大中小订阅这里定义了两个实体类,是一对多双向关联:public class SimpleConditionQuery extends TestCase { //public void testQuery1(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select id,name from Student s where like '%1%'");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//使用占位符public void testQuery2(){Session session = HibernateUtil.getSession();session.beginTransaction();// Query query = session.createQuery("select id,name from Student s where like ?"); // query.setParameter(0, "%1%");// List list = query.list();//基于方法链的编程List list = session.createQuery("select id,name from Student s where like ?") .setParameter(0, "%1%").list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//另外一种写法,:参数名称的方式传递参数public void testQuery3(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select id,name from Student s where like :myname");query.setParameter("myname", "%1%");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//public void testQuery4(){Session session = HibernateUtil.getSession();session.beginTransaction();List list = session.createQuery("select id,name from Student s where like :myname and s.id=:myid").setParameter("myname", "%1%").setParameter("myid", 12).list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//支持in,需要使用setParameterList进行参数传递,后一个参数传数组public void testQuery5(){Session session = HibernateUtil.getSession();session.beginTransaction();List list = session.createQuery("select id,name from Student s where s.id in(:myid)") .setParameterList("myid", new Object[]{1,3,5,7,9}).list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}、//分页查询 setFirstResult(),从0开始//setMaxResults,每页显示多少条数据//对象导航查询,在 hql中采用. 进行导航public void testQuery11(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select from Student s where like '%1%'");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){String name = (String) iter.next();System.out.println(name);}session.getTransaction().commit();}//连接查询,内连接,外连接,(左/右连接),//内连public void testQuery12(){Session session = HibernateUtil.getSession();session.beginTransaction();//数据库里,我们查询是这样写Select From A Left Join B On A.id=B.id//仔细看看在hibernate里是怎么写Query query = session.createQuery("select , from Student s join s.classes c where like '%班级9%'");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//左连接,即,把没有学生的班级也可以加载上来public void testQuery13(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select , from Classes c left join c.students s ");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//右连接,把没有班级的无业游民也加载上来public void testQuery14(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select , from Classes c right join c.students s ");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//统计查询public void testQuery15(){Session session = HibernateUtil.getSession();session.beginTransaction();// Query query = session.createQuery("select count(*) from Student ");// List list = query.list();//因为 count(*)得到的是一个单一值,所以可以如下Long count = (Long) session.createQuery("select count(*) from Student").uniqueResult();System.out.println(count);session.getTransaction().commit();}public void testQuery16(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select ,count(*) from Classes c join c.students group by order by ");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]);}session.getTransaction().commit();}//hibernate也提供原生SQL查询,session.createSQLQuery()public void testQuery9(){Session session = HibernateUtil.getSession();session.beginTransaction();List list = null;list = session.createSQLQuery("select * from student").list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+"---"+obj[1]+"---"+obj[2]);}session.getTransaction().commit();}//hibernate 也可以使用外置命名查询,即:sql语句与程序解耦//具体做法,在映射文件中采用 query标签,//<query name="searchStudent">//<![CDATA[// select s form Student s where s.id<?// ]]>// </query>//在代码里采用session.getNamedQuery("searchStudent")public void testQuery10(){Session session = HibernateUtil.getSession();session.beginTransaction();List list = null;list = session.getNamedQuery("searchStudent").setParameter(0, 10).list();Iterator iter = list.iterator();while(iter.hasNext()){Student stu = (Student) iter.next();System.out.println(stu.getId()+"---"+stu.getName());}session.getTransaction().commit();}}//查询多个简单属性,其集合元素是对象数组//数组元素的类型和对应的属性在实体类中的类型一致//数组的长度取决与select中属性的个数public void testQuery2(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select id,name from Student");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+" "+obj[1]);}session.getTransaction().commit();}//如果认为返回数组不够对象化,可以采用hql动态实例化student对象//此时list中为student对象集合,这是,Student实体要提供相应属性的构造函数public void testQuery3(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select new Student(id,name) from Student");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Student stu = (Student) iter.next();System.out.println(stu.getId()+"---"+stu.getName());}session.getTransaction().commit();}//多个属性查询,可以使用别名public void testQuery4(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select s.id, from Student s");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+" "+obj[1]);}session.getTransaction().commit();}//可以使用as命别名public void testQuery5(){Session session = HibernateUtil.getSession();session.beginTransaction();Query query = session.createQuery("select s.id, from Student as s");List list = query.list();Iterator iter = list.iterator();while(iter.hasNext()){Object[] obj = (Object[]) iter.next();System.out.println(obj[0]+" "+obj[1]);}session.getTransaction().commit();}。
hibernate sql写法
hibernate sql写法Hibernate是一个开源的、高效的、强大的Java持久化框架,它提供了面向对象的方式来操作关系型数据库。
使用Hibernate,开发者可以以一种简单、灵活的方式进行数据库操作,而无需编写大量的SQL 语句。
在Hibernate中,我们可以通过编写映射文件或注解来定义实体类与数据库表之间的映射关系,通过Session对象来执行对数据库的操作。
在Hibernate中,SQL语句可以通过多种方式来编写。
下面将针对Hibernate中的SQL编写进行详细介绍。
1. HQL(Hibernate Query Language)Hibernate Query Language(HQL)是一种面向对象的查询语言,它类似于SQL语句,但是使用的是实体类和属性名,而不是表名和列名。
HQL可以实现对实体对象的查询、更新和删除等操作。
以下是HQL的一些常用语法:-查询所有的实体对象:FROM实体类名-条件查询:FROM实体类名WHERE条件-投影查询:SELECT属性列表FROM实体类名-排序查询:FROM实体类名ORDER BY属性ASC/DESC-分页查询:FROM实体类名LIMIT开始位置,查询数量HQL的编写与SQL类似,但是可以直接使用实体类和属性名,从而更加面向对象。
例如,以下HQL语句可以查询出所有年龄大于18岁的用户:FROM User WHERE age > 182.原生SQL查询除了HQL,Hibernate还支持原生的SQL查询。
原生SQL查询可以直接编写传统的SQL语句,但是需要使用Session对象的createNativeQuery方法来执行。
以下是原生SQL查询的一些常用语法:-执行查询:session.createNativeQuery("SELECT * FROM表名").getResultList()-执行更新或删除:session.createNativeQuery("UPDATE/DELETE FROM表名WHERE条件").executeUpdate()-参数绑定:Query.setParameter(参数名,参数值)原生SQL查询可以更灵活地操作数据库,但是需要注意SQL语句的安全性和兼容性问题。
通常使用的Hibernate通常是三种查询及调用
相关文章:∙SSH通用查询DAO(2)∙应用Hibernate3的DetachedCriteria实现分页查询∙基于spring与hibernate的通用分页实现推荐圈子: GT-Grid更多相关推荐通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:1、QBE(Qurey By Example)检索方式QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。
一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。
QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。
在这种情况下,还是采用HQL检索方式或QBC检索方式。
Java代码1./**2. * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录3. * @param pageNo4. * 当前页数5. * @param pageSize6. * 每页显示的记录数7. * @param object8. * 将查询条件封装为Object9. * @return 将查询结果封装为Pager返回10. */11.public Pager findPageByExample(int pageNo, int pageSize, Objectobject)12.{13. Pager pager = null;14. try15. {16. Criteria criteria = this.getSession().createCriteria(17. Class.forName(this.getEntity()));18.19. if (object != null)20. {21. criteria.add(Example.create(object).enableLike());22. }23.24. // 获取根据条件分页查询的总行数25. int rowCount = (Integer) criteria.setProjection(26. Projections.rowCount()).uniqueResult();27. criteria.setProjection(null);28.29. criteria.setFirstResult((pageNo - 1) * pageSize);30. criteria.setMaxResults(pageSize);31.32. List result = criteria.list();33.34. pager = new Pager(pageSize, pageNo, rowCount, result);35.36. } catch (RuntimeException re)37. {38. throw re;39. } finally40. {41. return pager;42. }43.44.}注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。
Hibernate高级查询技巧
Hibernate高级查询技巧分页查询:在应用系统开发中,尤其是Web应用系统开发中,数据分页是一项普遍而又非常重要的非功能性的技术需求。
因为它对于提高系统运行效率,以及减少客户端与服务器间的通信量都有着非常非常重要的作用。
但是数据分页在系统实现中往往会带来很大的工作量,在基于JDBC的程序中,更是如此,因为不同的数据库提供了不同的数据分页技术(比如MySQL通过它的Limit字句实现数据分页,而Oracle通过它的rownum字句实现数据分页),这不但给实现带来了一定的困难,也为系统在不同数据间的移植带来了问题。
Hibernate通过对不同的数据库提供统一的接口设计,实现了通用化透明化的数据分页机制,比如我们可以通过QBC查询实现数据分页。
如下面代码所示:Criteria criteria=session.createCriteria(User.class);criteria.add(Expression.eq(“age”,20));//从检索结果中获取从第100条开始到第120条结束的20条记录criteria.setFirstResult(100);criteria.setFetchSize(20);同样,在Query接口中也提供了与其一致的方法。
这是Hibernate API提供的数据分页技术,但是有时候我们需要针对某一个底层数据库,提供应用系统统一的数据分页机制。
这时候我们可以通过实现Hibernate中的抽象类net.sf.hibernate.dialect.Dialect在Hibernate3中为org.hibernate.dialect.Dialect,这个抽象类是Hibernate提供的本地方言类,在本地方言类中封装了对各种不同的主流数据库特性的实现,如果需要针对某种数据库提供方言类支持,可以在Hibernate主配置文件中通过配置来指定(配置hibernate.dialect元素),通过对不同的数据库提供相应的dialect实现,可以消除不同数据库间的差异,从而在上层提供了一个透明的,数据库无关的存储层基础。
hibernate hql连接查询语法
Hibernate HQL(Hibernate Query Language)是一种基于SQL 的查询语言,它提供了一种方便的方式来执行数据库查询,同时也可以避免一些SQL 注入等安全问题。
在Hibernate HQL 中,可以使用以下语法进行连接查询:1. 内连接查询(INNER JOIN):```sqlSELECT entity1, entity2FROM entity1INNER JOIN entity2 ON entity1.id = entity2.idWHERE conditions```上面的查询会返回所有`entity1` 和`entity2` 之间存在连接的记录,其中`entity1.id` 和`entity2.id` 相等。
2. 左连接查询(LEFT JOIN):```sqlSELECT entity1, entity2FROM entity1LEFT JOIN entity2 ON entity1.id = entity2.idWHERE conditions```上面的查询会返回所有`entity1` 的记录以及与之相连接的`entity2` 的记录,如果`entity2` 不存在,则返回`null` 值。
3. 右连接查询(RIGHT JOIN):```sqlSELECT entity1, entity2FROM entity2RIGHT JOIN entity1 ON entity1.id = entity2.idWHERE conditions```上面的查询会返回所有`entity2` 的记录以及与之相连接的`entity1` 的记录,如果`entity1` 不存在,则返回`null` 值。
在连接查询中,`entity1` 和`entity2` 表示要连接的两个实体类,`id` 是实体类中的主键属性,`conditions` 是查询条件。
如果需要指定连接的条件,可以在`JOIN` 关键字后面指定连接条件。
hibernate查询数据库的三种方式
Hibernate查询数据库的三种方式一、Hibernate的HQL与SQL查询1.Hql(Hibernate Query Language)是面向对象的查询查询方式,HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,提供了类似标准SQL语句的查询方式,同时也提供了面向对象的封装。
HQL查询语句from关键字后面跟的类名+类对象,where后用对象的属性做条件;示例代码:(User是映射数据库的一个类)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String HQLString="from User u whereername='"+userForm.getUsername()+"'";String HQLString="from User u where ername=:uname";Session session=HibernateSessionFactory.currentSession();//获取事务session.beginTransaction();Query query=session.createQuery(HQLString);query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录//提交事务session.getTransaction().commit();//关闭SessionHibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}2.sql是面向数据库表查询,from后面跟的是表名,where后用表中字段做条件;示例代码:([xxdb].[dbo].[student]就是要查询的数据库表)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String SQLString="select*from[xxdb].[dbo].[student]u whereerName='"+userForm.getUsername()+"'";String SQLString=”select*from[xxdb].[dbo].[student]u whereerName=:uname”;Session session=HibernateSessionFactory.currentSession();session.beginTransaction();//Query query=session.createSQLQuery(SQLString).addEntity(User.class);//实体查询Query query=session.createSQLQuery(SQLString).addScalar("userid",StandardBasicTypes.INTEGER).addScalar("username",StandardBasicTypes.STRING).addScalar("password",StandardBasicTypes.STRING).addScalar("gender",StandardBasicTypes.INTEGER);//标量查询query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录session.getTransaction().commit();HibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}3.对比hql和sql查询方式我们可以发现他们之间的不同:a.首先是查询语句的不同,hql语句from后面跟的类名+类对象,where后用对象的属性做条件,而sql语句from后面跟的是表名,where后用表中字段做条件,这也就是面向对象和面向数据库的一个区别。
Hibernate查询语句大全
HQL: Hibernate查询语言Hibernate装备了一种非常强大的查询语言,这种语言看上去很像SQL。
但是不要被语法构造上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。
1.大小写敏感性问题除了Java类与属性的名称外,查询语句对大小写并不敏感。
所以SeLeCT 与sELEct 以及SELECT 是一样的,但是org.hibernate.eg.FOO 并不等价于org.hibernate.eg.Foo 并且foo.barSet 也不等价于foo.BARSET 。
本手册中的HQL关键字将使用小写字母. 很多用户发现使用完全大写的关键字会使查询语句的可读性更强, 但我们发现,当把查询语句嵌入到Java语句中的时候使用大写关键字比拟难看。
子句Hibernate中最简单的查询语句的形式如下:该子句简单的返回eg.Cat 类的所有实例。
通常我们不需要使用类的全限定名, 因为auto-import 〔自动引入〕是缺省的情况。
所以我们几乎只使用如下的简单写法:from Cat大多数情况下, 你需要指定一个别名, 原因是你可能需要在查询语句的其它局部引用到Catfrom Cat as cat这个语句把别名cat 指定给类Cat 的实例, 这样我们就可以在随后的查询中使用此别名了。
关键字as 是可选的,我们也可以这样写:from Cat cat子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿积或产生跨表的连接。
from Formula, Parameterfrom Formula as form, Parameter as param查询语句中别名的开头局部小写被认为是理论中的好习惯,这样做与Java变量的命名标准保持了一致(比方,domesticCat )。
3.关联(Association)与连接(Join)我们也可以为相关联的实体甚至是对一个集合中的全部元素指定一个别名, 这时要使用关键字join 。
Hibernate查询sql结果行数、查询列表的几种方法
Hibernate查询sql结果⾏数、查询列表的⼏种⽅法⼀、前⾔这个东西,难度⼏乎没有,就是繁琐。
⼀条简单的select count(*) from table_name都能有多种书写⽅式。
总是忘,这⾥记录下。
⼀、通过Criteria 查询查询⾏数:Criteria criteriaCount = getCriteria();criteriaCount = criteriaCount.add(Restrictions.eq("dispatchTaskId", dispatchTaskId));criteriaCount.setProjection(Projections.rowCount());Integer totalCount = ((Long) criteriaCount.uniqueResult()).intValue();查询列表:Criteria criteria = getCriteria();criteria.add(Restrictions.eq("eventId", eventInformationId));List<EventTaskAssignment> list = criteria.list();⼆、通过原⽣sql查询查询⾏数:SQLQuery queryCount = getSession().createSQLQuery("SELECT COUNT(*) FROM incidentInformation WHERE ii.incidentInformationId = :incidentInformationId AND dti.taskstate = :taskstate");queryCount.setParameter("incidentInformationId", incidentInformationId);queryCount.setParameter("taskstate", ETaskStatus.STATUS_INIT.getStatusValue());int count = ((BigDecimal) queryCount.uniqueResult()).intValue();return count;查询列表:1、返回的item为数据库表对应poSQLQuery query = getSession().createSQLQuery(sqlQuery);query.setParameter("userId", userId);query.addEntity(EventTaskAssignment.class);List<EventTaskAssignment> items = query.list();2、返回的item为voSQLQuery query = getSession().createSQLQuery(sqlBuffer.toString());query.setParameter("eventInformationId", eventInformationId);query.addScalar("userId", StandardBasicTypes.STRING);query.addScalar("userName", StandardBasicTypes.STRING);query.setResultTransformer(Transformers.aliasToBean(UserRoles.class));List<UserRoles> list = query.list();三、通过hibernate的查询语⾔查询String countHql = "select count(*) from a where and a.approveResult = :approveResult and a.approverId = :approverId";Query countQuery = getSession().createQuery(countHql);countQuery.setParameter("approverId", approverId);int count = ((Long) countQuery.uniqueResult()).intValue();。
子查询语法
子查询语法子查询语法是数据库查询语言中的一个重要部分,它可以在一个查询语句中嵌套另一个查询语句,用于获取更复杂的查询结果。
本文将介绍子查询语法的基本用法和常见应用场景。
一、子查询语法的基本用法子查询语法可以在SELECT、FROM、WHERE等子句中使用,用于实现更复杂的查询逻辑。
以下是子查询语法的基本用法:1. 在SELECT子句中使用子查询:SELECT column_nameFROM table_nameWHERE column_name = (SELECT column_name FROM table_name WHERE condition);2. 在FROM子句中使用子查询:SELECT column_nameFROM (SELECT column_name FROM table_name WHERE condition) AS alias_name;3. 在WHERE子句中使用子查询:SELECT column_nameFROM table_nameWHERE column_name IN (SELECT column_name FROM table_nameWHERE condition);1. 子查询与聚合函数的结合使用:SELECT column_nameFROM table_nameWHERE column_name > (SELECT AVG(column_name) FROM table_name);2. 子查询与EXISTS关键字的结合使用:SELECT column_nameFROM table_name t1WHERE EXISTS (SELECT column_name FROM table_name t2 WHERE t2.column_name = t1.column_name);3. 子查询与ANY/ALL关键字的结合使用:SELECT column_nameFROM table_nameWHERE column_name > ALL (SELECT column_name FROM table_name WHERE condition);4. 子查询与JOIN语句的结合使用:SELECT column_nameFROM table_name t1INNER JOIN (SELECT column_name FROM table_name WHEREcondition) t2ON t1.column_name = t2.column_name;5. 子查询与UPDATE语句的结合使用:UPDATE table_nameSET column_name = (SELECT column_name FROM table_name WHERE condition)WHERE condition;6. 子查询与DELETE语句的结合使用:DELETE FROM table_nameWHERE column_name IN (SELECT column_name FROM table_name WHERE condition);三、子查询语法的注意事项1. 子查询返回的结果集只能有一列,如果需要返回多列结果,可以使用JOIN语句;2. 子查询的性能较低,如果能使用其他方式替代子查询,应尽量避免使用子查询;3. 子查询嵌套层数过多会导致查询效率低下,应尽量简化查询逻辑。
Hibernate查询语句及Callback使用方法
1.from子句from Person表明从Person持久化类中选出全部的实例。
推荐:from Person as p2.select子句select from Person as pselect .firstName from Person as pselect new list(, p.address) from Person as pselect new ClassTest(, p.address) from Person as p (有前提)select as personName from Person as pselect new map( as personName) from Person as p (与new map()结合更普遍) 3.统计函数查询:1: count() 统计记录的条数2: min() 求最小值3: max() 求最大值4: sum() 求和4: avg() 求平均值//取得Student的数量Query query=session.createQuery("select count(*) from Student")//avg()取得Student平均年龄Query query=session.createQuery("select avg(s.age) from Student as s")//upper()方法将字符串转为大写Query query=session.createQuery("select upper() from Student as s")//去除重复行distinctQuery query=session.createQuery("select distinct s.age from Student as s") select count(*) from Personselect max(p.age) from Person as pselect || "" || p.address from Person as p4.多态查询from Person as pfrom ng.Object ofrom Named as n5.where子句from Person where name like "tom%"from Person as p where like "tom%"from Cat cat where like "kit%"select * from cat_table as table1 cat_table as table2 where table1.mate = table2.id and like "kit%"from Foo foo where foo.bar.baz.customer.address.city like "fuzhou%" from Cat cat, Cat rival where cat.mate = rival.mateselect cat, matefrom Cat cat, Cat matewhere cat.mate = matefrom Cat as cat where cat.id = 123from Cat as cat where cat.mate.id = 69from Person as personwhere person.id.country = 'AU'and person.id.medicareNumber = 123456from Account as accountwhere account.owner.id.country = 'AU'and account.owner.id.medicareNumber = 123456from Cat cat where cat.class = DomesticCatfrom Account as a where .firstName like "dd%" // 正确from Account as a where like "dd%" // 错误6.表达式=, <>, >, <, >=, <=, between, not between, in, not in, is, like等。
hibernate query language 语法
hibernate query language 语法Hibernate Query Language (HQL) 是一种面向对象的查询语言,与 SQL 不同,HQL 查询的对象是实体类而不是数据库表。
下面是 HQL 的语法:1. SELECT 子句:- 基本语法:SELECT [DISTINCT] 属性1 [, 属性2, ...] FROM 实体类名 [AS 别名]- 示例:SELECT name, age FROM Person- 使用 DISTINCT 关键字可去除重复的结果2. FROM 子句:- 基本语法:FROM 实体类名 [AS 别名]- 示例:FROM Person AS p- 实体类名区分大小写,使用 AS 关键字可指定别名,默认别名为实体类的首字母小写3. WHERE 子句:- 基本语法:WHERE 条件- 示例:WHERE age > 18 AND name LIKE 'John%'- 支持常见的比较运算符(>, <, >=, <=, =, !=),逻辑运算符(AND, OR, NOT),模糊匹配(LIKE, ILIKE)4. ORDER BY 子句:- 基本语法:ORDER BY 属性 [ASC|DESC]- 示例:ORDER BY age ASC- 可对结果根据指定属性进行升序(ASC,默认)或降序(DESC)排序5. GROUP BY 子句:- 基本语法:GROUP BY 属性- 示例:GROUP BY age- 可按指定属性对结果进行分组6. JOIN 子句:- 基本语法:[INNER|LEFT|RIGHT] JOIN 关联属性 [AS 别名] - 示例:LEFT JOIN p.address AS a- 可根据关联属性进行连接查询,使用 INNER JOIN, LEFT JOIN 或 RIGHT JOIN 指定连接类型,默认为 INNER JOIN7. 自定义查询:- 可使用 HQL 中的函数、操作符和表达式进行复杂查询,例如聚合函数(COUNT, AVG, SUM, MAX, MIN),运算符(+,-,*,/),条件表达式(CASE WHEN ... THEN ... ELSE ... END)注意:HQL 是基于 Hibernate 框架的查询语言,如果想要执行HQL 查询,需要先创建 Hibernate 的 Session,并使用 Session对象的 `createQuery()` 方法创建 Query 对象来执行查询。
hibernatehql语句详解
hibernatehql语句详解Hibernate HQL语句详解1. 什么是Hibernate HQL语句?Hibernate HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言。
它类似于SQL,但是更注重于面向对象的概念和操作。
2. HQL语句的基本语法•HQL语句以FROM关键字开始,后面跟着要查询的实体类名。
•可以使用SELECT关键字来选择要查询的属性。
•可以使用WHERE关键字来添加查询条件。
•可以使用JOIN关键字来进行表连接查询。
•可以使用ORDER BY关键字来排序查询结果。
•可以使用GROUP BY关键字来进行分组查询。
3. HQL中的参数绑定•HQL语句中可以使用占位符(?)来表示参数,然后使用setXxx 方法来为占位符绑定实际的值。
•也可以使用命名参数(:name)来表示参数,然后使用setParameter方法来为参数绑定实际的值。
4. HQL中的函数HQL支持多种函数,常用的函数有:•数字函数:abs、sqrt、mod等。
•字符串函数:length、concat、substring等。
•日期函数:year、month、day等。
5. HQL中的聚合函数HQL中支持多种聚合函数,常用的聚合函数有:•avg:计算平均值。
•sum:计算总和。
•max:获取最大值。
•min:获取最小值。
•count:计算记录数。
6. HQL中的子查询•子查询是指一个查询语句内包含另一个查询语句。
•子查询可以用在WHERE子句中的条件表达式中。
•HQL支持分页查询,可以使用setFirstResult和setMaxResults方法来实现分页。
•setFirstResult用于设置查询结果的起始位置。
•setMaxResults用于设置查询结果的最大数量。
8. HQL中的更新和删除操作•HQL不仅可以用于查询,还可以用于更新和删除操作。
Hibernate查询
Hibernate的查询语言:1.Native SQL:本地语言(数据库自己的SQL语句)功能强大,2.HQL Hibernate Query Language(更灵活,推荐) 条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.3.QBC(Query By Criteria) 查询方式这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections.Hibernate Query Language:HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作。
而且HQL是面向对象的,具备继承,多态和关联等特性。
from子句:from子句是最简单的HQL,例如from Student,也可以写成select s from Student s。
它简单的返回Student 类的所有实例。
值得注意的是除了JAVA类和属性的名称外,HQL语句对大小写不敏感。
select子句:有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如select from Student s带where条件的查询:where子句:HQL也支持子查询,它通过where子句实现这一机制。
where子句可以让用户缩小要返回的实例的列表范围。
例如下面语句会返回所有名字为"Bill"的Student实例:Query query = session.createQuery("from Student as s where ='Bill'");where子句允许出现的表达式包括了SQL中可以使用的大多数情况。
数学操作:+,-,*,/真假比较操作:=, >=, <=, <>, !=, like逻辑操作:and ,or, not字符串连接:||排序:order by连接查询与SQL一样,HQL也支持连接查询,如内连接,外连接和交叉连接:inner join:内连接left outer join:左外连接right outer join:右外连接full join:全连接,但不常用//sql写 select ... From 表1 inner join 表2 on 表1.列=表2.列注意join 后写一个的前面实体类别名.属性名可以使用冒号(:),作为占位符,来接受参数使用。
hibernate sqlquery查询语句
hibernate sqlquery查询语句Hibernate的SQLQuery查询语句可以使用基于SQL的查询来执行原生的SQL 语句。
下面是一些示例:1. 执行简单的SELECT语句:javaString sql = "SELECT * FROM employee";SQLQuery query = session.createSQLQuery(sql);List<Object[]> rows = query.list();for (Object[] row : rows) {Integer id = (Integer) row[0];String name = (String) row[1];处理查询结果}2. 通过参数化查询:javaString sql = "SELECT * FROM employee WHERE salary > :minSalary"; SQLQuery query = session.createSQLQuery(sql);query.setParameter("minSalary", 5000);List<Object[]> rows = query.list();处理查询结果3. 执行INSERT、UPDATE或DELETE语句:javaString sql = "INSERT INTO employee (id, name) VALUES (1, 'John')"; SQLQuery query = session.createSQLQuery(sql);int numOfRowsAffected = query.executeUpdate();4. 设置查询结果映射到实体类:javaString sql = "SELECT * FROM employee";SQLQuery query = session.createSQLQuery(sql);query.addEntity(Employee.class);List<Employee> employees = query.list();处理查询结果5. 使用原生的SQL查询结果中的字段和计算字段:javaString sql = "SELECT id, name, salary, salary * 12 AS annual_salary FROM employee";SQLQuery query = session.createSQLQuery(sql);query.setResultTransformer(Transformers.aliasToBean(EmployeeDTO.clas s));List<EmployeeDTO> employees = query.list();处理查询结果注意:在使用Hibernate的SQLQuery时,需要谨慎处理潜在的安全风险和SQL 注入攻击。
Hibernate对多表关联查询
Hibernate对多表关联查询由于公司项目的需要,我对Hibernate对多表关联查询研究了一下,现总结如下,供朋友参考。
一、Hibernate简介Hibernate是一个JDO工具。
它的工作原理是通过文件(一般有两种:xml文件和properties文件)把值对象和数据库表之间建立起一个映射关系。
这样,我们只需要通过操作这些值对象和Hibernate提供的一些基本类,就可以达到使用数据库的目的。
例如,使用Hibernate的查询,可以直接返回包含某个值对象的列表(List),而不必向传统的JDBC访问方式一样把结果集的数据逐个装载到一个值对象中,为编码工作节约了大量的时间。
Hibernate提供的HQL是一种类SQL语言,它和EJBQL 一样都是提供对象化的数据库查询方式,但HQL在功能和使用方式上都非常接近于标准的SQL.二、Hibernate与JDBC的区别Hibernate与JDBC的主要区别如下:1、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。
Hibernate可以用在任何JDBC可以使用的场合,从某种意义上来说,Hibernate在任何场合下取代JDBC.2、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。
3、Hibernate是做为JDBC的替代者出现的,不能用来直接和Entity Bean做对比。
三、Hibernate 进行多表关联查询Hibernate对多个表进行查询时,查询结果是多个表的笛卡尔积,或者称为“交叉”连接。
例如:from Student,Book from Student as stu,Book as boo from Student stu,Book boo注意:让查询中的Student和Book均是表student和book对应的类名,它的名字一定要和类的名字相同,包括字母的大小写。
hibernate多表关联查询
Hibernate是典型的OPM工具,它将每一个物理表格(Table)映射成为对象(Object),这发挥了面向对象的优势,使设计和开发人员可以从面向对象的角度来进行对数据库的管理。
在设计到多表操作时,Hibernate提供了与数据库表关系相对应的对象映射关系,一对一、一对多和多对多在这里都可以通过Hibernate的对象映射关系(Set等)来实现。
这为一般情况下的数据库多表操作提供了便捷途径。
关于这方面的介绍已经很多,在这里不再复述。
但是,在有些情况下的多表操作,比如一个统计顾客在2005年的消费总金额的SQL操作如下:select , count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from charge a, customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >='2005-01-01' and a.chargeEndTime < '2005-12-31' gourp by a.idCustomercustomer表和charge结构如下:customer表结构:+------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+-------------+------+-----+---------+-------+| IdCustomer | varchar(32) | | PRI | | || Name | varchar(30) | | | | |+------------+-------------+------+-----+---------+-------+charge表结构:+-----------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------------+-------------+------+-----+---------+-------+| IdCharge | varchar(32) | | PRI | | || Fee | double | YES | | NULL | || ChargeTimeBegin | datetime | YES | | NULL | || ChargeTimeEnd | datetime | YES | | NULL | |+-----------------+-------------+------+-----+---------+-------+在Hibernate的自带文档中有类似下面的多表查询操作提示:“select new OjbectC(field1, field2,...) from ObjectA a, ObjectB b ...”,分析一下可以看出这个操作有两个缺点:1)必须声明并创建类ObjectC,根据Hibernate的特点,需要写一个ObjectC.hbm.XML 的PO映射,在只用到创建查询结果的新对象的时候,这个映射可以是个虚的,即可以没有一个真正的数据库表和ObjectC对应,但是这样的一个虚设的逻辑显然已经违背了Hibernate的思想初衷;2)这个办法只能查询出但条结果记录并只能创建单个的ObjectC对象,这是很局限的,因此在某些情况下根本不能使用(比如本例)。
from (select ……)子查询
一、子查询在一个SQL语句中嵌套另一个SQL语句称为子查询。
当一个问题无法通过一步解决时可考虑使用子查询,一个出现在SELECT 语句的FROM子句中的子查询被称为"内嵌视图";一个出现在SELECT语句的WHERE子句中的子查询被称为"内嵌子查询";一个子查询能够包含另一个子查询,在一个顶级的查询中,Oracle数据库没有限制在FROM子句中的嵌套层数,可以在一个WHERE子句中嵌套255层子查询子查询可包括:1、单行子查询(子查询只返回一行)单行子查询可使用如下操作符:> 大于< 小于= 等于>= 大于等于<= 小于等于<> 不等于2、多行子查询(子查询返回多行)多行子查询可使用如下操作符:IN 等于列表中的任何一个ANY 和子句中返回的任意一个值比较ALL 和子句中返回的所有值比较出现在WHERE子句中的子查询语法Sql代码SELECT select_listFROM tableWHERE expr operator(SELECT select_listFROM table);查询scott用户下的emp表中工资比scott高的员工的信息(此操作中的子查询只返回一行记录)Sql代码SQL> select * from emp2 where sal>(3 select sal from emp where ename='SCOTT');EMPNO ENAME JOB MGR HIREDA TE SAL COMM DEPTNO---------- ---------- --------- ---------- -------------- ---------- ---------- ----------7839 KING PRESIDENT 17-11月-81 5000 10查询scott用户下的emp表中所有的经理的信息(此操作子查询会返回多行记录)Sql代码SQL> select * from emp2 where empno in (3 select mgr from emp);EMPNO ENAME JOB MGR HIREDA TE SAL COMM DEPTNO---------- ---------- --------- ---------- -------------- ---------- ---------- ----------7566 JONES MANAGER 7839 02-4月-81 2975 207698 BLAKE MANAGER 7839 01-5月-81 2850 307782 CLARK MANAGER 7839 09-6月-81 2450 107788 SCOTT ANAL YST 7566 19-4月-87 3000 207839 KING PRESIDENT 17-11月-81 5000 107902 FORD ANAL YST 7566 03-12月-81 3000 20已选择6行。
Hibernate中用hql查询部分字段
Hibernate中⽤hql查询部分字段
Hibernate中⽤hql查询部分字段
hql查询单表部分字段:
在hibernate中,⽤hql语句查询实体类,采⽤list⽅法的返回结果为⼀个List,该List中封装的对象分为以下三种情况:
1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本⾝,各属性都将得到填充。
2.只查询⼀个字段,默认情况下,list中封装的是Object对象。
3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数⼀致。
对于后两种情况,⽤标签遍历时不太⽅便,因为⽆法直接转换成实体类的对象。
⽐较简单的解决⽅法是:
在hql中使⽤ select new 包名.类名(属性1,属性2……) from 实体类,同时在实体类中添加带参的构造⽅法,参数的个数和顺序与(属性1,属性2……) 保持⼀致,这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使⽤起来更为⽅便。
hql查询多表部分字段:
select new 包名.表1实体类名(表1.属性1,表2.属性2……) from 表1实体类,表2实体类 where 表1.ID=表2.ID(即相关联的字段),同时在要返回的表1实体类中添加表2的属性和带参的构造⽅法,参数的个数和顺序与(表1.属性1,表2.属性 2……) 保持⼀致
不知道是否还有其他⽅法实现,请⾼⼈指点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
今天徒弟用到了一句复杂的查询语句。
结果执行报错,但是在SQL中执行没有问题,于是来求助我了。
语句的HQL/SQL格式如下:select count(1) ,cxltype,sum(dzsje),sum(iperson)from (selectxl.cxltype,g.iperson,(select sum(y.dzsje) from Ysklist as y wherey.cykpid = g.cregno) as dzsje from Guestreg as g,Xl as xl where g.xluuid = xl.uuid ) as t where …… group by t.cxltype结果执行出错,最终发现,HQL无法支持from后面跟子查询的方式,网上查了N 多资料,发现遇到这个问题的人还真是不少,但每一个相关的问题帖都没有满意的答复,甚至于多数都是没有跟帖的。
一阵心寒,hibernate叱咤风云,竟然对这个支持如此之弱?虽然这个语句可以通过另外的方法来做(比如建视图或者直接使用SQL来做),但总是不甘心,于是又开始查阅各处资料,最后找到了思路,觉得既然HQL不支持,那么只能把这种子查询封装为对象来做了,那么肯定是需要hbm配置这种临时的子查询对象的,于是开始着手hbm配置的资料中查,hbm中配置对象的都是class标签,开始把范围缩小,针对hbm的class标签的属性资料开始翻查,找到了几个比较可能的属性,where、subselect、mutable、entity-bean,貌似这些都可能跟临时对象有关。
于是反复尝试,并继续翻查资料最终在Hibernate reference 3.2.0 ga 正式版中文参考手册中找到了一些比较可靠的资料:5.1.3. class你可以使用class元素来定义一个持久化类:<classname="ClassName"table="tableName"discriminator-value="discriminator_value"mutable="true|false"schema="owner"catalog="catalog"proxy="ProxyInterface"dynamic-update="true|false"dynamic-insert="true|false"select-before-update="true|false"polymorphism="implicit|explicit"where="arbitrary sql where condition"persister="PersisterClass"batch-size="N"optimistic-lock="none|version|dirty|all"lazy="true|false"entity-name="EntityName"check="arbitrary sql check condition"rowid="rowid"subselect="SQL expression"abstract="true|false"node="element-name"/>name (可选): 持久化类(或者接口)的Java全限定名。
如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。
table (可选 - 默认是类的非全限定名): 对应的数据库表名。
discriminator-value (可选 - 默认和类名一样): 一个用于区分不同的子类的值,在多态行为时使用。
它可以接受的值包括 null 和 not null。
mutable (可选,默认值为true): 表明该类的实例是可变的或者不可变的。
schema (可选): 覆盖在根<hibernate-mapping>元素中指定的schema名字。
catalog (可选): 覆盖在根<hibernate-mapping>元素中指定的catalog名字。
proxy (可选): 指定一个接口,在延迟装载时作为代理使用。
你可以在这里使用该类自己的名字。
dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。
dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。
select-before-update (可选, 默认为 false): 指定Hibernate除非确定对象真正被修改了(如果该值为true-译注),否则不会执行SQL UPDATE 操作。
在特定场合(实际上,它只在一个瞬时对象(transient object)关联到一个新的session中时执行的update()中生效),这说明Hibernate 会在UPDATE 之前执行一次额外的SQL SELECT操作,来决定是否应该执行UPDATE。
polymorphism(多态) (可选, 默认值为 implicit (隐式) ): 界定是隐式还是显式的使用多态查询(这只在Hibernate的具体表继承策略中用到-译注)。
where (可选) 指定一个附加的SQLWHERE 条件,在抓取这个类的对象时会一直增加这个条件。
persister (可选): 指定一个定制的ClassPersister。
batch-size (可选,默认是1) 指定一个用于根据标识符(identifier)抓取实例时使用的"batch size"(批次抓取数量)。
optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。
(16)lazy (可选): 通过设置lazy="false",所有的延迟加载(Lazy fetching)功能将被全部禁用(disabled)。
(17)entity-name (可选,默认为类名): Hibernate3允许一个类进行多次映射(前提是映射到不同的表),并且允许使用Maps或XML代替Java层次的实体映射(也就是实现动态领域模型,不用写持久化类-译注)。
更多信息请看第 4.4 节“动态模型(Dynamic models)” and 第 18 章XML映射。
(18)check (可选): 这是一个SQL表达式,用于为自动生成的schema添加多行(multi-row)约束检查。
(19)rowid (可选): Hibernate可以使用数据库支持的所谓的ROWIDs,例如:Oracle数据库,如果你设置这个可选的rowid, Hibernate可以使用额外的字段rowid实现快速更新。
ROWID是这个功能实现的重点,它代表了一个存储元组(tuple)的物理位置。
(20)subselect (可选): 它将一个不可变(immutable)并且只读的实体映射到一个数据库的子查询中。
当你想用视图代替一张基本表的时候,这是有用的,但最好不要这样做。
更多的介绍请看下面内容。
(21)abstract (可选): 用于在<union-subclass>的继承结构(hierarchies)中标识抽象超类。
注意其中红色的字体,这就是关键之处,往下我找到了相关的内容:对Hibernate映射来说视图和表是没有区别的,这是因为它们在数据层都是透明的(注意:一些数据库不支持视图属性,特别是更新的时候)。
有时你想使用视图,但却不能在数据库中创建它(例如:在遗留的schema中)。
这样的话,你可以映射一个不可变的(immutable)并且是只读的实体到一个给定的SQL子查询表达式:<class name="Summary"><subselect>select , max(bid.amount), count(*)from itemjoin bid on bid.item_id = item.idgroup by </subselect><synchronize table="item"/><synchronize table="bid"/><id name="name"/>...</class>定义这个实体用到的表为同步(synchronize),确保自动刷新(auto-flush)正确执行,并且依赖原实体的查询不会返回过期数据。
<subselect>在属性元素和一个嵌套映射元素中都可见。
显然这就是我一直在找的东东了,hibernate支持自身建立视图,而不需要依赖于数据库。
虽然它本身的说法这是用来替代视图的,但其实这就是带子查询的sql,看我们最终的配置结果。
临时子查询视图Bean[其中第二个非默认的构造函数是不能少的,不然对象无法创建]:Java代码1.public class TestBean {2.private Integer id;3.private String cxltype;4.private Integer iperson;5.private Double dzsje;6.public TestBean(){}7.8.public TestBean(String cxltype, Integer iperson, Double dzsje) {9.super();10.this.cxltype = cxltype;11.this.iperson = iperson;12.this.dzsje = dzsje;13.}14.public String getCxltype() {15.return cxltype;16.}17.public void setCxltype(String cxltype) {18.this.cxltype = cxltype;19.}20.public Integer getIperson() {21.return iperson;22.}23.public void setIperson(Integer iperson) {24.this.iperson = iperson;25.}26.public Double getDzsje() {27.return dzsje;28.}29.public void setDzsje(Double dzsje) {30.this.dzsje = dzsje;31.}32.33.public Integer getId() {34.return id;35.}36.37.public void setId(Integer id) {38.this.id = id;39.}40.}TestBean的hbm配置:Xml代码1.<hibernate-mapping>2.<class name="TestBean" mutable="false">3.<subselect>4.select xl.cxltype,g.iperson,(select sum(y.dzsje) from Ysklist asy where y.cykpid = g.cregno) as dzsje5.from Guestreg as g,Xl as xl6.where g.xluuid = xl.uuid7.</subselect>8.<synchronize table="Guestreg"/>9.<synchronize table="Xl"/>10.<id name="id" type="integer">11.<column name="id" />12.<generator class="identity" />13.</id>14.<property name="cxltype" type="string">15.<column name="cxltype"></column>16.</property>17.<property name="iperson" type="integer">18.<column name="iperson"></column>19.</property>20.<property name="dzsje" type="double">21.<column name="dzsje"></column>22.</property>23.</class>24.</hibernate-mapping>HQL语句:select t.cxltype,sum(t.dzsje),sum(t.iperson) from TestBean as twhere …… group by t.cxltypeHibernate生成的SQL语句:Hibernate: select testbean0_.cxltype as col_0_0_, sum(testbean0_.dzsje) as col_1_0_, sum(testbean0_.iperson) as col_2_0_ from (select xl.cxltype,g.iperson,(select sum(y.dzsje) from Ysklist as y where y.cykpid = g.cregno) as dzsjefrom Guestreg as g,Xl as xlwhere g.xluuid = xl.uuid) testbean0_ where 1=1 group by testbean0_.cxltype可以看得出来,这就是文章最开始要完成的SQL子查询语句到此告一段落,花了我半个下午的时间搞定。