mysql hql查询语句_使用Query进行HQL语句查询和SQL语句查询

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=newArrayList();

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:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public Listhqlquerylist(String hql){

Session session=HibernateSessionFactory.getSession();

Transaction tx=session.beginTransaction();

List p = null;try{

Query query=session.createQuery(hql);

p=query.list();

tx.commit();

}catch(Exception e){

e.printStackTrace();

tx.rollback();

}returnp;

}

View Code

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

1)query.iterator()方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public Iteratorhqlqueryiterator(String hql){

Session session=HibernateSessionFactory.getSession();

Transaction tx=session.beginTransaction();

Iterator p = null;try{

Query query=session.createQuery(hql);

p=query.iterate();

tx.commit();

}catch(Exception e){

e.printStackTrace();

tx.rollback();

}finally{

session.clear();

}returnp;

}

View Code

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public Iteratorhqlqueryiterator(String hql){

session=HibernateSessionFactory.getSession();

Transaction tx=session.beginTransaction();

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

}*/

returnp;

}

View Code

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public Person queryUniqueResult(intid){

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

}*/

returnp;

}

View Code

4、标量查询

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

demo:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public static voidmain(String[] args){

PersonDAO persondao=newPersonDAO();

String hql="select P.name,count(P.address) from Person P";

Iterator it=persondao.hqlqueryScalar(hql);while(it.hasNext()){

Object[] o=it.next();

System.out.println(o[0]+"\t"+o[1]);

}

}public IteratorhqlqueryScalar(String hql){

session=HibernateSessionFactory.getSession();

Transaction tx=session.beginTransaction();

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

}*/

returnp;

}

View Code

5、分页查询

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

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

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

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

demo:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public Iterator queryhql(String hql,int first,intmax){

session=HibernateSessionFactory.getSession();

Query query=session.createQuery(hql);

query.setFirstResult(first);

query.setMaxResults(max);

Iterator s=query.list().iterator();returns;

}

StudentDAO studentdao=newStudentDAO();

String hql="from Student";int first=1;int max=2;

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

}

View Code

SQL语句查询

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

demo:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public static voidmain(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 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());

}

View Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值