六种方式实现hibernate查询,及IDE推荐

简介:            这些天过的好乱,也许是因为考完试了,心里有些松懈吧。也许是最近发生的事对我有些触动吧。感觉自己都已经不懂自己了。面对一些人的教导,我很感激。因为很多话都对我有非常大的帮助和启发,也让我除了做技术,玩编程外,明白了很多道理,也许这就是一个人成熟的过程吧。
 


           这些天过的好乱,也许是因为考完试了,心里有些松懈吧。也许是最近发生的事对我有些触动
吧。感觉自己都已经不懂自己了。面对一些人的教导,我很感激。因为很多话都对我有非常大的帮助和
启发,也让我除了做技术,玩编程外,明白了很多道理,也许这就是一个人成熟的过程吧。我真的很希
望我能够忘掉以前的不懂事,忘掉以前的轻狂,踏踏实实的做技术。

           自己的“真理”有时也会错,自己的想法有时也很“天真”。我真的很想静一静。晚饭后看了

一个在百度实习的师兄写的一篇日志,觉得写的很棒,明白了高手的一个定义,或者说是一种境界,一种

高深的东西。

           我很想从现在做起,使自己能够真正享受编程带来的快乐,没有虚荣,没有竞争,没有杂念。
只有快乐,只有充实,只有无悔。当然我说到做到,那篇日志讲的是一个从点到面,从面到点的哲理。
我觉得有必要写一个hibernate的总结性随笔,从点到面,讲讲hibernate查询的6种方法。分别是HQL查询
,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询

           如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能,但是
从一个点,让我们掌握6中方法,则提供了更多选择。每一种方法都有其适用的情况与前提。

HQL查询

HQL是hibernate自己的一套查询语言,于SQL语法不同,具有跨数据库的优点。示例代码:

复制代码
static void query(String name){
  Session s=null;
  try{
   s=HibernateUtil.getSession();
   
   //from后面是对象,不是表名
   String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
   Query query=s.createQuery(hql);
   query.setString("name", name);
   
   List<Admin> list=query.list();
   
   for(Admin admin:list){
    System.out.println(admin.getAname());
   }
  }finally{
   if(s!=null)
   s.close();
  }
 }
复制代码

 

适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。

对象化查询Criteria方法

 

复制代码
static void cri(String name,String password){
  Session s=null;
  try{
   s=HibernateUtil.getSession();
   
   Criteria c=s.createCriteria(Admin.class);
   c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
   c.add(Restrictions.eq("apassword", password));
   
   List<Admin> list=c.list();
   for(Admin admin:list){
    System.out.println(admin.getAname());
   }
  }finally{
   if(s!=null)
   s.close();
  }
 }

复制代码

 

适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。

动态分离查询DetachedCriteria

 

复制代码
static List dc(DetachedCriteria dc) {

  Session s = HibernateUtil.getSession();
  Criteria c = dc.getExecutableCriteria(s);
  List rs = c.list();
  s.close();
  return rs;
 }
复制代码

 

 

复制代码
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
  int id = 1;
  if (id != 0)
   dc.add(Restrictions.eq("id", id));
  Date age = new Date();
  if (age != null)
   dc.add(Restrictions.le("birthday", age));
  List users = dc(dc);
  System.out.println("离线查询返回结果:" + users);

复制代码

 

适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。  缺点:适用面较HQL有限。

例子查询

复制代码
static List example(User user) {
  Session s = HibernateUtil.getSession();
  List<User> users = s.createCriteria(User.class).add(
    Example.create(user)).list();
  // List<User>
  // users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
  // .createCriteria("child").add((Example.create(user))).list();
  return users;
 }

复制代码

 

适用情况:面向对象操作。   缺点:适用面较HQL有限,不推荐。


sql查询

复制代码
static List sql() {

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

复制代码

 

适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法   缺点:破坏跨平台,不易维护,不面向对象。

命名查询

 

static List namedQuery(int id) {
  Session s = HibernateUtil.getSession();
  Query q = s.getNamedQuery("getUserById");
  q.setInteger("id", id);
  return q.list();
 }

 

复制代码
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.sy.vo.User" table="user" catalog="news">
    
 

    </class>
    <!-- 命名查询:定义查询条件 -->
    <query name="getUserById">
     <![CDATA[from User where id=:id]]>
    </query>
    <!-- 命名查询中使用sql,不推荐使用,影响跨数据库
    <sql-query name="getUserById2">
     <![CDATA[select * from User where  ]]>
    </sql-query> -->
</hibernate-mapping>

复制代码

 

适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象。基于hql和sql,有一定缺陷。

目录
相关文章
|
8月前
|
机器学习/深度学习 人工智能 运维
使用AI进行系统调优:给系统装上“智能大脑”
使用AI进行系统调优:给系统装上“智能大脑”
376 10
|
关系型数据库 MySQL 数据库
MySql 数据库 - 重置数据库、重置初始密码方法,数据库初始化方法,长时间不用忘记密码暴力解决方法
MySql 数据库 - 重置数据库、重置初始密码方法,数据库初始化方法,长时间不用忘记密码暴力解决方法
1148 0
MySql 数据库 - 重置数据库、重置初始密码方法,数据库初始化方法,长时间不用忘记密码暴力解决方法
|
消息中间件 SQL 分布式计算
大数据-64 Kafka 高级特性 分区Partition 分区重新分配 实机实测重分配
大数据-64 Kafka 高级特性 分区Partition 分区重新分配 实机实测重分配
399 7
|
9月前
|
运维 安全 BI
中小企业如何选购访客管理系统?
还在用传统方式登记访客信息?草料二维码提供免费高效的访客登记管理系统,扫码登记、数据统计、安全保障,1天即可上线,提升企业形象和管理效率!
em/px/rem/vh/vw区别
【10月更文挑战第24天】理解和掌握 em、px、rem、vh、vw 这几种单位的特点和应用,能够帮助我们更好地进行网页设计和布局,实现更优秀的用户体验和适应不同屏幕尺寸的能力。
|
安全 新能源 知识图谱
固态电池:电动汽车的能源革新
【10月更文挑战第15天】固态电池凭借其高能量密度、长续航、卓越安全性和快速充电等优势,正引领新能源汽车领域的技术革命。本文详细探讨了固态电池的技术特点、优势及其对电动汽车产业的影响,展示了其在提升续航里程、增强安全性和降低成本方面的巨大潜力。随着技术的不断进步和成本的降低,固态电池有望成为推动电动汽车行业发展的关键力量,开启一个更加绿色高效的交通新时代。
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
429 0
|
Java API 数据库
【神操作!】Spring Boot打造RESTful API:从零到英雄,只需这几步,让你的Web应用瞬间飞起来!
【8月更文挑战第12天】构建RESTful API是现代Web开发的关键技术之一。Spring Boot因其实现简便且功能强大而深受开发者喜爱。本文以在线图书管理系统为例,展示了如何利用Spring Boot快速构建RESTful API。从项目初始化、实体定义到业务逻辑处理和服务接口实现,一步步引导读者完成API的搭建。通过集成JPA进行数据库操作,以及使用控制器类暴露HTTP端点,最终实现了书籍信息的增删查改功能。此过程不仅高效直观,而且易于维护和扩展。
285 1
|
数据采集 自然语言处理 数据挖掘
【NLP-新闻文本分类】1 数据分析和探索
文章提供了新闻文本分类数据集的分析,包括数据预览、类型检查、缺失值分析、分布情况,指出了类别不均衡和句子长度差异等问题,并提出了预处理建议。
287 1
|
Java 容器
SpringBoot修改默认端口号
有时候我们可能需要启动不止一个SpringBoot,而SpringBoot默认的端口号是8080,所以这时候我们就需要修改SpringBoot的默认端口了。修改SpringBoot的默认端口有两种方式。下面就分别说一下这两种方式。 修改application.properties 第一种方式我们只需要在application.properties中加这样的一句话就可以了:server.
4360 1