hibernate常用API详解++HQL++SQL

合集下载

hql 语句

hql 语句

hql 语句
HQL(Hibernate Query Language)是Hibernate框架中的一种查询语言,类似于SQL语句,但是HQL是面向对象的查询语言,它使用Hibernate 中的对象模型来进行查询。

以下是一些HQL语句的示例:
1. 查询所有的学生信息
```
from Student
```
2. 查询学生姓名为“张三”的信息
```
from Student where name='张三'
```
3. 查询学生姓名为“张三”且年龄大于18岁的信息
```
from Student where name='张三' and age>18
```
4. 查询学生姓名为“张三”或者“李四”的信息
```
from Student where name='张三' or name='李四' ```
5. 查询学生信息并按照年龄升序排序
```
from Student order by age asc
```
6. 查询学生信息并限制返回结果的数量为10条
```
from Student limit 10
```
7. 查询学生信息并统计总数
```
select count(*) from Student
```
以上是一些HQL语句的示例,你可以根据具体的需求进行修改和扩展。

hibernate sql拼接原理

hibernate sql拼接原理

Hibernate SQL拼接原理1. 什么是HibernateHibernate是一个开源的Java持久化框架,它提供了一个对象关系映射(Object-Relational Mapping,ORM)的解决方案,用于将Java对象与关系数据库进行映射。

通过Hibernate,我们可以使用面向对象的方式来操作数据库,而不需要直接编写SQL语句。

Hibernate采用了一种称为“延迟加载”的机制,它会在需要访问数据时才去执行SQL查询。

这种机制可以提高性能,并且使得开发者可以将更多的精力放在业务逻辑上。

2. Hibernate SQL拼接原理在使用Hibernate时,我们通常使用HQL(Hibernate Query Language)或者Criteria API来查询数据。

这些查询语言会被转换成对应的SQL语句,并由Hibernate执行。

2.1 HQL和SQLHQL是一种面向对象的查询语言,它类似于SQL但具有更高级的特性。

例如,HQL支持继承、多态、关联等概念,并且可以直接操作Java对象而不需要关心底层数据库表结构。

当我们使用HQL进行查询时,Hibernate会将HQL语句转换成对应的SQL语句,并通过JDBC驱动执行SQL查询。

这个过程包括两个阶段:解析和执行。

2.2 解析阶段在解析阶段,Hibernate会对HQL语句进行语法分析,并根据查询条件生成对应的SQL查询。

这个过程包括以下几个步骤:2.2.1 解析HQL语句首先,Hibernate会将HQL语句解析成一个抽象的查询树(Query Tree)。

这个查询树表示了HQL语句的结构和含义。

例如,对于以下的HQL语句:String hql = "from Employee e where = :deptName";Hibernate会解析成如下的查询树:SELECTeFROMEmployee eWHERE = :deptName2.2.2 解析实体和属性接下来,Hibernate会解析查询树中的实体和属性,并将它们映射到数据库表和列。

hibernate深度学习游离状态HQL

hibernate深度学习游离状态HQL

hibernate深度学习游离状态HQL当我学完这个之后我仿佛都懂了 = =或许这就是 hibernate的⼒量吧.操纵持久化对象(Session)1.1. 在hibernate中java对象的状态Hibernate 把对象分为 4 种状态:¨ 持久化状态,¨ 临时状态,¨ 游离状态,¨ 删除状态.Session 的特定⽅法能使对象从⼀个状态转换到另⼀个状态1.2. 临时对象(transient)¨ 在使⽤代理主键的情况下, OID 通常为 null¨ 不处于 Session 的缓存中¨ 在数据库中没有对应的记录1.2.1. 删除对象(Removed)¨ OID 不为 null¨ 从⼀个 Session实例的缓存中删除¨ Session 已经计划将其从数据库删除, Session 在清理缓存时, 会执⾏ SQL delete 语句, 删除数据库中的对应记录¨ ⼀般情况下, 应⽤程序不该再使⽤被删除的对象1.2.2. 持久化对象(也叫”托管”)(Persist)1.2.3.¨ OID 不为 null¨ 位于 Session 缓存中¨ 持久化对象和数据库中的相关记录对应¨ Session 在清理缓存时, 会根据持久化对象的属性变化, 来同步更新数据库¨ 在同⼀个 Session 实例的缓存中, 数据库表中的每条记录只对应唯⼀的持久化对象1.2.4. 游离对象(也叫”脱管”)(Detached)¨ OID 不为 null¨ 不再处于 Session 的缓存中¨ ⼀般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录1.2.5. 对象的状态转换说明(图)对象的状态转换图测试hibernate中java对象的状态程序代码⽣命周期状态tx = session.beginTransaction();开始⽣命周期临时状态Customer c = new Customer);Session.save(c)处于⽣命周期中转变为持久化状态Long id=c.getId();处于⽣命周期中处于持久化状态c = null;Customer c2 =(Customer)session.load(Customer.class,id);mit();session.close();处于⽣命周期中转变为游离态c2.getName();处于⽣命周期中处于游离态c2 = null;结束⽣命周期结束⽣命周期1.2.6. 对象的状态总结Session缓存存在对应的记录数据中存在对应的记录临时态no no持久态yes可能有也可能没有游离态no可能有(数据没有删除)也可能没有1.2.7. 操纵持久化对象的⽅法(Session中)1.2.8. save()Session 的 save() ⽅法使⼀个临时对象转变为持久化对象。

hibernate like查询语句

hibernate like查询语句

Hibernate Like查询语句在Hibernate中,可以使用HQL (Hibernate Query Language) 或Criteria API 进行查询。

如果您想要进行"like" 查询,这取决于您的需求和您正在使用的具体查询语言。

1.使用HQL进行"like"查询:javaString hql = "FROM Employee WHERE name LIKE :pattern";Query query = session.createQuery(hql);query.setParameter("pattern", "%" + nameToSearch + "%");List results = query.list();在这里,:pattern是一个参数,它将在运行时被替换为nameToSearch的值。

%是SQL的通配符,表示任何数量的任何字符。

2.使用Criteria API进行"like"查询:javaCriteria criteria = session.createCriteria(Employee.class);criteria.add(Restrictions.like("name", nameToSearch,MatchMode.ANYWHERE));List results = criteria.list();在这里,我们使用了Restrictions.like方法,它允许我们执行一个"like"查询。

MatchMode.ANYWHERE表示我们想要在任何位置匹配搜索字符串。

请注意,这些示例假设您正在使用Hibernate 5或更高版本。

如果您使用的是早期版本,语法可能会略有不同。

hibernate sql写法

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语句的安全性和兼容性问题。

hql语法

hql语法

hql语法HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它类似于SQL,但是是针对对象进行查询的,而不是针对数据表操作的。

HQL语法非常类似于SQL语法,只不过它是面向对象的查询语言。

以下是一些常用的HQL语法,在此进行详细介绍。

1. 查询所有数据HQL语句:from 实体类对象说明:使用from关键字可以查询指定实体类所有记录,这里的实体类是指映射到数据库表的Java类,实体类对象是Java类的实例化对象。

例如:from Employee说明:查询Employee表的所有记录。

说明:使用where子句可以指定查询条件,属性名称是指实体类中的某个属性名,属性值是指该属性所对应的值。

3. 查询满足多个条件的数据HQL语句:from 实体类对象 where 属性名称1=属性值1 and 属性名称2=属性值2说明:使用and关键字可以同时指定多个查询条件。

from Employee where name='Tom' and age=254. 查询包含某个值的数据说明:使用like关键字可以查询包含某个值的记录,%表示任意字符。

5. 查询指定字段数据6. 使用聚集函数查询说明:使用聚集函数可以进行统计查询。

7. 连接查询说明:使用join可以进行连接查询,使用on子句指定连接条件。

from Employee e inner join e.department d on e.departmentId=d.id8. 分组查询9. 排序查询说明:使用order by进行排序查询,可以指定升序或降序,默认为升序。

综上所述,HQL语法与SQL语法相似,可以使用各种关键字进行高级查询,对查询结果进行聚合计算、排序、分组、分页等各种操作,可满足日常开发中绝大部分查询需求。

hibernate查询数据库的三种方式

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查询sql结果行数、查询列表的几种方法

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();。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

)hibernate常用API详解分类:Hibernate2013-05-25 18:55 1251人阅读评论(0) 收藏举报转自:/blog/1327883hibernate常用API详解以下示例均以两张表为例:member和userinfo,member帐号信息表外键关联userinfo用户基本信息表,主键自动生成即可然后映射出的POJO如下:public class Userinfo implements Serializable{// primary keyprivate ng.Integer id;// fieldsprivate ng.String name;private ng.String code;private ng.String birthday;private ng.String address;private java.util.Date createTime;private ng.Integer deleteFlag;// collectionsprivate java.util.Set<com.bless.model.Member> members;//省略 getter setter}public class Member implements Serializable{// primary keyprivate ng.Integer id;// fieldsprivate ng.String loginCode;private ng.String password;private ng.Integer deleteFlag;// many to oneprivate erinfo fkUserinfo;//省略getter setter}1、Hibernate提供多种方法查询数据库数据下面以一个最简单的查询为例:SELECT * FROM TABLE为例1-1简单HQL语句查询Hibernate提供了HQL查询,HQL是Hibernate推荐语句,它屏蔽了不同数据库SQL不兼容的问题,使用HQL写的查询语句在主流数据库上都能执行。

执行HQL需要创建Query对象:getSession().createQuery(hql语句);简单HQL格式:FROM POJO 对应SQL语句:SELECT * FROM POJO对应的表名千万注意:HQL语句中的表名和字段名不是数据库的表名和字段名,而是对应ORM映射POJO的类名和属性名!Java代码1. Query query = baseDao.getQuery("FROM Member");2. List<Member> lstM = query.list();3. for (Member member : lstM) {4. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());5. }结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name:Java代码1. for (Member member : lstM) {2. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getName());3. }结果:一句SQL查询Member表,每一次for循环又发一句SQL查询Userinfo表总结:被查询表中如果有外键关联,在执行查询时能将外键关联字段的值查询出来,但如果想查询关联表的其它字段会另外发SQL,这个特别要注意!1-2简单SQL语句查询Hibernate同样支持写SQL,对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口Java代码1. SQLQuery sql = baseDao.getSQLQuery("SELECT * FROM member");2. //查询出的结果放到指定POJO中3. sql.addEntity(Member.class);4. List<Member> lstM = sql.list();5. for (Member member : lstM) {6. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());7. }结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name,结果与前面使用HQL查询一样:一句SQL查询Member表,随后每一次for循环又发一句SQL查询Userinfo表1-3Hibernate条件查询(Criteria)HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而非在他们的Java代码中嵌入字符串。

对于那部分人来说,Hibernate提供了直观的Criteria查询API。

获取Hibernate的Criteria对象方法:getSession().createCriteria(Class对象);Java代码1. Criteria crit = baseDao.getCriteria(Member.class);2. List<Member> lstM = crit.list();3. for (Member member : lstM) {4. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());5. }其实上面这种方式就是发了一句SQL:SELECT * FROM member结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name,结果与前面情况一样2、在简单的select from table基础上,加上分页和排序以此为例:查询第11条~20条数据,按照ID降序排列2-1使用HQLJava代码1. Query query = baseDao.getQuery("FROM Member m ORDER BY m.id DESC");2. query.setFirstResult(10);3. query.setMaxResults(10);4. List<Member> lstM = query.list();5. for (Member member : lstM) {6. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());7. }2-2使用SQLJava代码1. SQLQuery sql = baseDao.getSQLQuery("SELECT * FROM member m ORDERBY m.id DESC");2. sql.setFirstResult(10);3. sql.setMaxResults(10);4. //查询出的结果放到指定POJO中5. sql.addEntity(Member.class);6. List<Member> lstM = sql.list();7. for (Member member : lstM) {8. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());9. }2-3使用CriteriaJava代码1. Criteria crit = baseDao.getCriteria(Member.class);2. crit.setFirstResult(10);3. crit.setMaxResults(10);4. crit.addOrder(Order.desc("id"));5. List<Member> lstM = crit.list();6. for (Member member : lstM) {7. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());8. }3、数据库查询核心是条件,绝大多数SQL都会带有WHERE子句,下面介绍简单的WHERE 查询以此为例:SELECT * FROM member m WHERE m.login_code like …kaka%‟ ANDm.password in (…12345‟,…123451‟,‟123452‟) AND m.delete_flag=0;这里面有like、in和=三种查询特别注意:绝对不推荐直接在SQL语句后面拼接参数值:“*** WHERE id=”+id+” AND name like ”+name+”%”;这种方式可能会造成很严重的后果:每一个不同的id值都会在内存中创建一个SQL请求对象,如果id多并且多次执行该句SQL很可能出现宕机状况!推荐使用下面这些赋值方式,下面的方式都只会在内存中创建一个SQL请求对象。

3-1-1使用HQL“WHERE字段=?”的形式给条件赋值这种打?号传值的方式在JDBC是非常常见的了,使用HQL语句也可以通过这种方式赋值:Java代码1. Query query = baseDao.getQuery("FROM Member m WHERE m.loginCode LIKE? AND m.password in (?,?,?) AND m.deleteFlag=?");2. query.setParameter(0, "kaka%");3. query.setParameter(1, "12345");4. query.setParameter(2, "123451");5. query.setParameter(3, "123452");6. query.setParameter(4, 0);7. List<Member> lstM = query.list();8. for (Member member : lstM) {9. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());10. }通过query.setParameter(int,Obejct)方法即可给每个?赋值,注意第一个参数是从下标0开始!3-1-2使用HQL “WHERE字段=:key”的形式给条件赋值这种赋值方式是HQL特有的,什么意思呢,直接看例子分析:Java代码1. Query query = baseDao.getQuery("FROM Member m WHERE m.loginCode LIKE:code AND m.password in (:pwd) AND m.deleteFlag=:flag");2. query.setParameter("code", "kaka%");3. query.setParameterList("pwd", new String[]{"12345","123451","123452"});4. query.setParameter("flag", 0);5. List<Member> lstM = query.list();6. for (Member member : lstM) {7. System.out.println("id:"+member.getId()+" fk_id:"+member.getFkUserinfo().getId());8. }上面例子关键代码是Query调用setParameter(String,Object)和setParameterList两个方法,前者是赋单一值,后者是赋多个值(特别适合in查询赋值)。

相关文档
最新文档