Hibernate怎样用HQL语句查询?

Hibernate怎样用HQL语句查询?,第1张

HQL语句 *** 作的是po类,也就是实体类。hql通过映射文件,将类名和表名、类属性和表字段一一对应起来。

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来 *** 纵数据。

使用HQL查询的代码一:

public void test01() {  
    Session session = HibernateUtilsopenSession();  
    Query query = sessioncreateQuery("from Student");  
    List<Student> stus = querylist();  
     for (Student stu : stus) {  
        Systemoutprintln(stu);  
    }  
}

代码二:

public void test02() {  
    Session session = HibernateUtilsopenSession();  
    Query query = sessioncreateQuery("select stu from Student stu");  
    List<Student> stus = querylist();  
    for (Student stu : stus) {  
        Systemoutprintln(stu);  
    }  
}

11、SQL概述

HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL接近SQL`语句查询语法。

完整的HQL语句形式如下:

select | update | delete … from … where … group by … having … order by … asc|desc

其中的update、delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。HQL查询在整个Hibernate实体 *** 作体系中占核心地位。

String hql = "HQL语句";

Query query = sessioncreateQuery(hql);

List list = querylist(); //查询得到多个实体对象集合

Object result = queryuniqueResult(); //查询得到一个实体对象

int x = queryexecuteUpdate(); //执行update或delete语句,返回数据表受影响行数

12、实体查询

查询过程中表名使用类名,列名使用属性名,类名和属性名称区分大小写

String hql="from Users";//from 实体类类型名称

Query query = sessioncreateQuery(hql);

List<Users> list = querylist();

for (Users user : list) {

    Systemoutprintln(user);

}

13、带where的查询

Query query = sessioncreateQuery("from Users where uid=3");

Users user = (Users) queryuniqueResult();//uniqueResult 单一对象

Systemoutprintln(user);

Query query = sessioncreateQuery("from Users where uid>5");

List<Users> list = querylist();

for (Users user : list) {

    Systemoutprintln(user);

}

13、属性查询

查询部分属性

String hql="select uuid,uuname,uupwd from Users u where uuname='张三'";

Query query = sessioncreateQuery(hql);

List<Object[]> list = querylist();

for (Object[] objects : list) {

    Systemoutprintln(ArraystoString(objects));

}

String hql="select new Users(uuname,uupwd) from Users u where uuname='张三'";

Query query = sessioncreateQuery(hql);

List<Users> list = querylist();

for (Users user : list) {

    Systemoutprintln(user);

}

14、实体的更新和删除

从hibernate 3版本开始才支持

//更新

String hql="update Users set uname='王五',upwd='321' where uid=3";

int res = sessioncreateQuery(hql)executeUpdate();

//删除

String hql="delete from Users where uid=3";

int res = sessioncreateQuery(hql)executeUpdate();

/

返回值结果:

正整数:表受影响的行数据

0: 语句正常执行,但没有行受影响

负整数:通常是-1,执行HQL语句是一条查询语句

/

HQL语句不能做添加

15、分组与排序

排序

处理方式和SQL语句中的排序是一样的

String hql="from Users order by uid";

Query query = sessioncreateQuery(hql);

List<Users> list = querylist();

for (Users user : list) {

    Systemoutprintln(user);

}

order by语句只能出现在语句的最后位置

分组

处理方式和SQL语句中分组查询相同

分组语句需要处理筛选,只能使用having语句,而不能使用where语句。

String hql = "select edeptdeptno, count(e) from Emp e group by deptdeptno";

String hql = "select edeptdeptno, count(e) from Emp e group by deptdeptno having count(e)>=5";

16、参数绑定

使用占位参数

String hql="from Users where uid= or uname=";

Query query = sessioncreateQuery(hql);

//索引从0开始

querysetInteger(0, 3);//querysetParameter(0, 3);

querysetString(1, "张三");//querysetParameter(1, "张三");

List<Users> list = querylist();

for (Users user : list) {

    Systemoutprintln(user);

}

使用参数名称

String hql = "from Users where uid=:no1 or uid=:no2";

Query query = sessioncreateQuery(hql);

querysetInteger("no1", 1);

querysetInteger("no2", 3);

//

可以使用点位参数和名称参数混合使用

String hql = "from User where uid= or uid=:no2";

Query query = sessioncreateQuery(hql);

querysetInteger(0, 7788);

querysetInteger("no2", 7566);

//

//使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数

17、连接查询

--SQL语句:查询员工姓名、薪资、部门名称

SELECT ENAME,SAL,DNAME

FROM EMP e JOIN DEPT d ON eDEPTNO=dDEPTNO

SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMPDEPTNO=DEPTDEPTNO

没有on语句

能被连接到查询中的必须是主查询对象的子属性

String hql="SELECT eename, esal, edeptdname FROM Emp e";

//HQL连接查询

String hql="SELECT eename, esal, ddname FROM Emp e JOIN edept d";

String hql = "SELECT e FROM Emp e JOIN edept"; //JOIN将没有意义

String hql = "FROM Emp e JOIN edept";

Query query = sessioncreateQuery(hql);

List<Object[]> list = querylist();

//List集合中的数组中会保存两个元素:

//0:主数据(Emp)

//1:从数据(Dept)

//查询编号为7788的员工信息,同时将对应的dept信息和manager信息查询并保存在对应的子属性中

String hql = "FROM Emp e JOIN FETCH edept d JOIN FETCH emanager m WHERE eempno=7788";

Query query = sessioncreateQuery(hql);

Emp emp = (Emp) queryuniqueResult();

Systemoutprintln(emp);

Systemoutprintln(empgetManager());

Systemoutprintln(empgetDept());

18、分页

String hql = "from Users";

Query query = sessioncreateQuery(hql);

querysetFirstResult(0);

querysetMaxResults(2);

2、QBC查询

QBC(Query By Criteria)查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。

QBC查询最重要的三个类:

Restrictions 条件限制

Projections 列设射

Order 排序

21、查询实现

Criteria criteria = sessioncreateCriteria(Usersclass);

//sessioncreateCriteria("entityUsers");

//sessioncreateCriteria(Usersclass, "别名");

List<Dept> list = criterialist();

//查询单行结果(如果结果有两行或更多,会报错)

Object uniqueResult = criteriauniqueResult();

22、Projections 列投射

语法:

//查询uname属性

Criteria criteria = sessioncreateCriteria(Usersclass);

PropertyProjection property = Projectionsproperty("name");

criteriasetProjection(property);

List<Object> result = criterialist();

//查询uname, upwd属性

Criteria criteria = sessioncreateCriteria(Usersclass);

//1创建投射列表

ProjectionList projectionList = ProjectionsprojectionList();

//2向投射列表中添加列投射

PropertyProjection property1 = Projectionsproperty("uname");

PropertyProjection property2 = Projectionsproperty("upwd");

projectionListadd(property1)add(property2);

//3将投射列表设置到准则中

criteriasetProjection(projectionList);

List<Object> result = criterialist();

返回值类型 方法名称 描述

PropertyProjection Projectionsproperty 指定某属性

AggregateProjection Projectionsavg 求平均值

CountProjection Projectionscount 统计某属性的数量

CountProjection ProjectionscountDistinct 统计某属性不同值的数量

PropertyProjection ProjectionsgroupProperty 指定某个属性为分组属性

AggregateProjection Projectionsmax 求最大值

AggregateProjection Projectionsmin 求最小值

ProjectionList ProjectionsprojectionList 创建一个ProjectionList对象

Projection ProjectionsrowCount 查询结果集中的记录条数

AggregateProjection Projectionssum 求某属性的合计

23、Restrictions 条件限制

语法:

Criteria criteria = sessioncreateCriteria(Usersclass);

Criterion notNull = RestrictionsisNotNull("comm");

criteriaadd(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)

List<Users> list = criterialist();

返回值类型 方法名称 描述

SimpleExpression Restrictionseq 等于(equal)

Criterion RestrictionsallEq 使用Map,Key/Valu进行多个等于的比对

SimpleExpression Restrictionsgt 大于(great than)

SimpleExpression Restrictionsge 大于等于(great than or equal)

SimpleExpression Restrictionslt 小于(less than)

SimpleExpression Restrictionsle 小于等于(less than or equal)

Criterion Restrictionsbetween 对应SQL的between

SimpleExpression Restrictionslike 对应SQL的like

Criterion Restrictionsin 对应SQL的in

LogicalExpression Restrictionsand and关系

LogicalExpression Restrictionsor or关系

Criterion RestrictionsisNull 为空

Criterion RestrictionssqlRestriction SQL限定查询

Criterion Restrictionsnot 取反

23、Order排序

语法:

Criteria criteria = sessioncreateCriteria(Deptclass);

criteriaaddOrder(Orderasc("name"))

addOrder(Orderdesc("loc"));

//SELECT FROM DEPT ORDER BY name ASC, loc DESC

返回值类型 方法名称 描述

Order Orderasc(String propertyName) 升序

Order Orderdesc(String propertyName) 降序

24、分页查询

Criteria criteria = sessioncreateCriteria(Deptclass);

int pageNum = 2, pageSize = 5;

criteriasetFirstResult((pageNum-1)pageSize); //查询起始行下标

criteriasetMaxResults(pageSize); //查询的最大行数

List list = criterialist();

//setFirstResult方法和setMaxResults方法同样可以在SQLQuery及Query类型上使用

3、原生SQL查询

1、查询

String sql = "select uid,uname,upwd from _users";

List list = sessioncreateSQLQuery(sql)list();

for(Object obj : list){

    Systemoutprintln(obj);

}

2、 addEntity()

String sql = "select uid,uname,upwd from _users";

// addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装

SQLQuery query = sessioncreateSQLQuery(sql)addEntity(Usersclass);

List<User> list = querylist();

for(Users user : list){

Systemoutprintln(usergetUname());

}

3、 uniqueResult

String sql = "select uid,uname,upwd from _users where uid = 2";

SQLQuery query = sessioncreateSQLQuery(sql)addEntity(Usersclass);

Users user = (Users) queryuniqueResult();//返回单一对象

Systemoutprintln(usergetUname());

USB Microphone >获取分组的最大排序序号即可啦:
select top 1 dlie1
ROW_NUMBER() OVER(order by dc_lie1) as _page_row_num_hb
from individual d
group by dc_ssn,dfull_name
order by _page_row_num_hb desc


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13398804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-28
下一篇 2023-07-28

发表评论

登录后才能评论

评论列表(0条)

保存