HQL的语法比较简单,与普通SQL的区别之处是针对对象的不同,在查询语句中将sql中的表名替换成了sql中的持久化类名,因为hibernate机制是基于对象进行查询的。

不带参数的查询,语句是“from POJO”的形式,其中POJO即为持久化类名称

Query query=session.createQuery("from User");

带参数的查询

接口Query提供了对命名参数、JDBC风格的(?)两种参数的绑定方法。

命名参数在查询字符串中是形如name的标识符。

命名参数的优点:

1、命名参数与其在查询串中出现的顺序无关。

2、它们可在同一查询串中多次出现。

3、它们本身是自我说明的。

命名参数的使用格式是 :username /* username这里泛指命名参数名 */

赋值采用: Query的setXXX()f方法。

/* 这是使用一个命名参数username,然后给命名参数设置值为“admin”的例子*/
Query query=session.createQuery("from User where username=:username");
query.setString("username","admin");
/* 使用集合类型的命名参数的例子 */
List names=new ArrayList();
names.add("admin");
names.add("test");
Query query=session.createQuery("from User where username in (:nameList)");
query.setParameterList("nameList",names);

hibernate使用问号参数时与JDBC不同,hibernate对参数从0开始计数。JDBC应该是从0开始的

Query query=session.createQuery("from User where username=?");
query.setString(0,"admin");

在HQL语句中可以设置多个问号参数,之后按照"0、1、2、3...”的序号形式来设置各个参数的值。

取读query中的值:

1、将query中的值转换成list然后进行后面的操作

query.list()方法。

demo:

public List<Person> hqlquerylist(String hql){
Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
List<Person> p = null;
try{
Query query=session.createQuery(hql);
p=query.list();
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}
return p;
}

2、将query中的值转换成iterator对象然后进行后面的操作

1)query.iterator()方法

public Iterator<Person> hqlqueryiterator(String hql){
Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Iterator<Person> p = null;
try{
Query query=session.createQuery(hql);
p=query.iterate();
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}finally{
session.clear();
}
return p;
}

2)、将query.list()得到的对象转换称为iterator对象

public Iterator<Person> hqlqueryiterator(String hql){
session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Iterator<Person> p = null;
try{
Query query=session.createQuery(hql);
//p=query.iterate();
p=query.list().iterator();
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}/*finally{
session.close();
}*/
return p;
}

3、当已知query中的对象为0个或者1个的时候,可以使用uniqueResult()取得一个对象。

返回:单个实例或者null
抛出:当返回的实例大于一个的时候的抛出NonUniqueResultException

public Person queryUniqueResult(int id){
Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Person p = null;
try{
Query query=session.createQuery("from Person where id=:id");
query.setInteger("id", id);
p=(Person) query.uniqueResult();
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}/*finally{
session.close();
}*/
return p;
}

4、标量查询

查询可以在select语句中指定类的属性,甚至可以调用SQL统计函数。统计结果或者属性被称为“标量Scalar”的结果。

demo:

public static void main(String[] args){
PersonDAO persondao=new PersonDAO();
String hql="select P.name,count(P.address) from Person P";
Iterator<Object[]> it=persondao.hqlqueryScalar(hql);
while(it.hasNext()){
Object[] o=it.next();
System.out.println(o[0]+"\t"+o[1]);
}
}
public Iterator<Object[]> hqlqueryScalar(String hql){
session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Iterator<Object[]> p = null;
try{
Query query=session.createQuery(hql);
//p=query.iterate();
p=query.list().iterator();
tx.commit();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}/*finally{
session.close();
}*/
return p;
}

5、分页查询

我们知道,sqlserver的查询使用的是top,mysql使用的是limit,oracle使用的是rownumber。

其实hibernate有快捷的分页查询方式,框架可以自动生成对应的分页查询语句。

使用query对象的setFirstResult()和对象的setMaxResult()设置查询的起始指针和查询的最大数量,再使用query的其他取出对象方法得到想要的值。hibernate自动生成sql查询语句。

注意:指针是从0开始的。也就是指针为0的对应数据库中的第一条记录。

demo:

public Iterator<Student> queryhql(String hql,int first,int max){
session=HibernateSessionFactory.getSession(); Query query=session.createQuery(hql);
query.setFirstResult(first);
query.setMaxResults(max);
Iterator<Student> s=query.list().iterator();
return s;
}
StudentDAO studentdao=new StudentDAO();
String hql="from Student";
int first=1;
int max=2;
Iterator<Student> s=studentdao.queryhql(hql, first, max);
while(s.hasNext()){
Student stu=s.next();
System.out.println(stu.getName()+"\t"+stu.getAge()+"\t"+stu.getSex()+"\t"+stu.getTelephone());
}

SQL语句查询

使用createSQLQuery()方法,然后在后面加上addEntity()

demo:

public static void main(String[] args){
String sql="select * from student where age=:age and name=:name";
Session session=HibernateSessionFactory.getSession();
SQLQuery sqlquery=session.createSQLQuery(sql).addEntity(Student.class);
sqlquery.setString("name", "guozhen");
sqlquery.setInteger("age", 21);
List<Student> s=sqlquery.list();
Student stu=s.get(0);
System.out.println(stu.getName()+"\t"+stu.getAge()+"\t"+stu.getId()+"\t"+stu.getTelephone()+"\t"+stu.getTelephone()); }

使用Query进行HQL语句查询和SQL语句查询的更多相关文章

  1. MySQL5.6 怎样优化慢查询的SQL语句 -- SQL优化

    上篇:MySQL5.6 怎样优化慢查询的SQL语句 -- 慢日志介绍 在实际的日志分析中,通常慢日志的log数量不少,同一时候同样的查询被记录的条数也会非常多.这里就须要怎样从慢日志查询中找到最有问题 ...

  2. MySQL5.6 怎样优化慢查询的SQL语句 -- 慢日志介绍

    近期有个开发团队抱怨我们平台包括的mysql cluster不行,总是报mysql的"heartbeat Error".分析了他们收集的日志.没有发现mysql cluster节点 ...

  3. ASP.NET实现列表页连接查询 拼接sql语句 绑定grivdView

    ASP.NET实现列表页连接查询 拼接sql语句 如图效果: 基本需求:1.当页面第一次加载的时候默认查询一个月时间(或者说是登陆者所属权限的所有数据)的数据绑定到gridView 2.添加查询条件时 ...

  4. 在magento里把查询语句转换称sql语句

    在magento里把查询语句转换称sql语句 $order->getSelectsql(true); order为对象.

  5. 查询拼接SQL语句,多条件模糊查询

    多条件查询,使用StringBuilder拼接SQL语句,效果如下: 当点击按钮时代码如下: private void button1_Click(object sender, EventArgs e ...

  6. MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)

    http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...

  7. oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)

    先列上我的数据库表格: c_date(Date格式)     date_type(String格式) 2011-01-01                   0 2012-03-07         ...

  8. mysql按年度、季度、月度、周、日统计查询的sql语句

    本文介绍一些mysql中用于查询的sql语句,包括按年度.季度.月度.周.日统计查询等,有需要的朋友,可以参考下. 一.年度查询 查询 本年度的数据   SELECT * FROM blog_arti ...

  9. MySql实现分页查询的SQL,mysql实现分页查询的sql语句(转)

    http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要:MySQL数据库实现分页查询的SQL语句写法! 一:分页需求: 客户端通 ...

  10. 第二十篇ORM查询与SQL语句

    ORM查询与SQL语句 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情 ...

随机推荐

  1. 【第二章】 第二个spring-boot程序

    上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入spring-boot官方文档推荐的方式来开发代码,并引入我们在spring开发中service层等的调用. 1. ...

  2. HDU 1863 畅通工程 (最小生成树

    看卿学姐视频学到的题目 kruskal算法实现最小生成树 #include<bits/stdc++.h> using namespace std; ; typedef long long ...

  3. 如何给域名配置https证书

    http和https的区别就是,后者在网络传输过程中会很安全,原因就是给http安装了SSL证书. SSL证书有免费的和收费的,收费的顾名思义就是保护的方面更多,更安全.收费的像单域名的一年有几百.几 ...

  4. 【Android实验】线程的使用-计时器

    目录 实验目的 实验要求 实验过程 实验结果 实验代码 实验总结 实验目的 熟悉和掌握Android线程的使用 实验要求 完成一个秒表,具备启停功能,正确使用工作线程完成界面刷新 分析秒表的计时是否准 ...

  5. FAST:通过Floodlight控制器下发流表

    参考: Floodlight+Mininet搭建OpenFlow(四):流表操作 通过Floodlight控制器下发流表 下发流表的方式有两种: 1.借助Floodlight的北向API,利用curl ...

  6. python 判断一个数字是否为4的幂

    def is_Power_of_four(n): while n and not (n & 0b11): n >>= ) print(is_Power_of_four()) pri ...

  7. 【转】VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别

    ☞ 本文主要介绍软件『VMware Workstation(虚拟机)』的相关内容:VMware网络连接模式—桥接.NAT以及仅主机模式的详细介绍和区别. 其下列版本/分支可以参考本文: 全部版本/分支 ...

  8. Qt5.3.2(VS2010)_调试_进入Qt源码

    1.必须是 Debug模式 2. http://blog.csdn.net/mayenjoy/article/details/42535789 http://blog.csdn.net/goforwa ...

  9. 【Golang】幽灵变量(变量覆盖)问题的一劳永逸解决方法

    背景 在我们公司,测试定位问题的能力在考核中占了一定的比例,所以我们定位问题的主动性会比较高.因为很多开发同学都是刚开始使用golang,所以bug频出,其中又以短变量声明语法导致的错误最多.所以就专 ...

  10. 【Golang 接口自动化01】使用标准库net/http发送Get请求

    发送Get请求 使用Golang发送get请求很容易,我们还是使用http://httpbin.org作为服务端来进行演示. package main import ( "bytes&quo ...