hibernate 查询方式有哪些?

2021-04-14 18:49发布

17条回答
浅浅77
2楼 · 2021-04-15 10:01

1.HQL (Hibernate Query Language)

  • 语法类似sql

  • 把sql语句的表名换成了类名,把字段名换成实体类中的属性

  • 具有跨数据库的优点

2.QBC (Query By Criteria)

这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤 (只有"DetachedCriteria离线查询"不同, 详见示例) :

  • 使用Session实例的createCriteria(XXX.class)方法创建Criteria对象;

  • 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组;

  • 使用Criteria对象的list()方法进行查询并返回结果。

3.SQL (Structured Query Language)

  • 违背了hibernate的跨平台优点,不易维护,不面向对象。不推荐使用。


是开心果呀 - 热爱生活
3楼 · 2021-04-15 10:13

Hibernate有五种常见的查询方式:

(1)NativeSQL 是运用数据库本身提供的数据查询语言进行查询,这种方式查询效率高,与数据库耦合性高依赖于具体的数据库。因为不同的数据库厂商提供的查询语言会存在某些细微差别。

(2)HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query lanague

(3) EJBQL(JPQL 1.0) 是EJB提供的查询语言

(4)QBC(query by cretira)通过Cretira接口进行查询

(5)QBE(query by Example) 通过Example编程接口进行查询

从功能强弱上排序:NativeSQL > HQL > EJBQL(JPQL 1.0) >QBC(query by cretira) >QBE(query by Example)


三岁奶猫
4楼 · 2021-04-15 13:08

Hibernate的查询方式hibernate的查询方式常见的主要分为三种: HQL, QBC(命名查询)

用户555666
5楼 · 2021-04-15 16:22
hibernate的查询方式主要有以下几种,你可以看看,也可以去官方下载文档来看看,不过是英文版本。,谢谢
hibernate查询方式 

♦  小结Hibernate... 
♦  Hibernate对多... 
♦  hibernate查询... 
♦  Hibernate之查... 
♦  Hibernate 查... 
    更多相关推荐...
在HQL中关键字不区分大小写,但是属性和类名区分大小写,下面介绍各种类型的Hibernate的HQL查询。

1、Hibernate HQL查询:简单属性查询
* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致 
数组的长度取决与select中属性的个数

* 如果认为返回数组不够对象化,可以采用HQL动态实例化Student对象
2、Hibernate HQL查询:实体对象查询

* N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题,所谓的N+1是在查询的时候发出了N+1条sql语句,1: 首先发出一条查询对象id列表的sql,N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
* list和iterate的区别?

* list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据

* iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题
3、Hibernate HQL查询:条件查询

* 可以采用拼字符串的方式传递参数

Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();    
* 可以采用 ?来传递参数(索引从0开始)

Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?").setParameter(0, "%1%").list();      //可以使用?方式传递参数      //参数的索引从0开始      //传递的参数值,不用单引号引起来      //注意方法链编程    
* 可以采用 :参数名 来传递参数
Java代码:
List students = session.createQuery  ("select s.id, s.name from Student s where s.name like :myname").setParameter("myname", "%1%").list();    
* 如果传递多个参数,可以采用setParamterList方法
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)").setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list();    
* 在HQL中可以使用数据库的函数,如:date_format
Java代码:
List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").setParameter(0, "2008-02").list();     
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    //查询2008-01-10到2008-02-15创建的学生          
List students = 
session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")                .
.setParameter(0, sdf.parse("2008-01-10 00:00:00"))                .
setParameter(1, sdf.parse("2008-02-15 23:59:59"))                      
.list();     
4、Hibernate HQL查询:直接使用sql进行查询
Java代码:
List students = session.createSQLQuery("select * from t_student").list();    

不会返回对象,而是所有属性,  

5、Hibernate HQL查询:分页查询
* setFirstResult(),从0开始
* setMaxResults,每页显示多少条数据
Java代码:
List students = session.createQuery("from Student")                .setFirstResult(1)                .setMaxResults(2)                .list();    
6、Hibernate HQL查询:对象导航查询,在HQL中采用 . 进行导航
7、Hibernate HQL查询:连接查询* 内连
Sql代码:
SELECT s.name, c.name FROM Student s (inner) join s.classes c    
* 外连接(左连接/右连接)

Sql代码:
SELECT s.name, c.name FROM Student s left join s.classes c    
8、Hibernate HQL查询:统计查询
Java代码: 
List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +"group by c.name order by c.name").list();      for (Iterator iter=students.iterator(); iter.hasNext();) {           Object[] obj = (Object[])iter.next();           System.out.println(obj[0] + ", " + obj[1]);      }    
9、DML风格的操作(尽量少用,因为和缓存不同步)
Java代码:
session.createQuery 
("update Student s set s.name=? where s.id< ?")                           
.setParameter(0, "李四")                           
.setParameter(1, 5)                           
.executeUpdate();    
应当尽量少用,因为和缓存不同步,也就是说,假如在执行上面的语句之前,已经把student封装成一个list曾经拿了出来,再执行上面的语句对 student中的表进行数据更新,然后再list Student表,则此时的list是从缓存中取的数据,而不是从表中找到的数据,也就是 说,list拿到的是update前的数据,所以造成了这种不同步,所以这种风格尽量少用。
从这个方面也可以看得出Hibernate并不适用于聚集性,统计,大量批量的更新,删除等操作。


椰子椰子
6楼 · 2021-04-15 18:54

(一) HQL

(二)条件查询Criteria Query

(二)条件查询Criteria Query


LERRR
7楼 · 2021-04-16 08:47

(1)NativeSQL 是运用数据库本身提供的数据查询语言进行查询,这种方式查询效率高,与数据库耦合性高依赖于具体的数据库。因为不同的数据库厂商提供的查询语言会存在某些细微差别。

(2)HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query lanague

(3) EJBQL(JPQL 1.0) 是EJB提供的查询语言

(4)QBC(query by cretira)通过Cretira接口进行查询

(5)QBE(query by Example) 通过Example编程接口进行查询


1.1 HQL(Hibernate Query Language)#

与所熟悉的SQL的语法差不太多,不同的就是把表名换成了类或者对象,如下示例:

 

@Override
public SysUser findUserByLoginName(String pLoginName) {
    String hql = "from SysUser as u where u.loginName = ?";
    List users = getHibernateTemplate().find(hql, pLoginName); //pLoginName对应?
    return users.isEmpty() ? null : users.get(0);
}

1.2 SQL(Structured Query Language)#

 

static List sql() {
   Session s = HibernateUtil.getSession();
    Query q = s.createSQLQuery("select * from user").addEntity(User.class);
    List rs = q.list();
    s.close();
    return rs;
}

 

缺点:违背了hibernate的跨平台优点,不易维护,不面向对象。不推荐使用。

 

1.3 QBC(Query By Criteria)#


有点好奇
9楼 · 2021-04-16 14:51

基础查询


条件查询   建议使用字符串的占位符的方式


分页查询   setFirstResult第几个开始 setMaxResults 查找几个


相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问