在Hibernate中可以使用以下方式进行查询:
NativeSQL:不能实现跨数据库,本地的数据库语言
HQL:Hibernate自带的查询语言,将HQL语言根据方言进行转换SQL
EJBQL(JPQL1.0):可以认为是HQL的子集(这部分用的最多)
QBC(Query by Criteria):按条件查询
QBE(Query by Example):按样例查询
功能由下到上功能由弱到强
HQL
Hibernate提供了一种非常强大的查询语言HQL,其语法类似SQL,但是HQL是非常有意识的被设计为完全面向对象的查询(SQL提供的聚合函数更加丰富)。HQL除了Java类和属性的名称外,查询语句对大小写并不敏感。
首先我们定义几个实体
Category.java
package com.iflytek.QBC; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; /** * @author xudongwang 2011-11-3 板块 * * 板块与主题之间是一对多关系 */ @Entity public class Category { private int id; private String name; @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Msg.java
package com.iflytek.QBC; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; /** * @author xudongwang 2011-11-3 帖子回复 * */ @Entity public class Msg { private int id; private String cont; private Topic topic; @ManyToOne public Topic getTopic() { return topic; } public void setTopic(Topic topic) { this.topic = topic; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCont() { return cont; } public void setCont(String cont) { this.cont = cont; } }
MsgInfo.java
package com.iflytek.HQL1; /** * @author xudongwang 2011-11-3 * */ public class MsgInfo { // VO或DTO Value Object一般用来装临时的值 private int id; private String cont; private String topicName; private String categoryName; public MsgInfo(int id, String cont, String topicName, String categoryName) { super(); this.id = id; this.cont = cont; this.topicName = topicName; this.categoryName = categoryName; } public String getTopicName() { return topicName; } public void setTopicName(String topicName) { this.topicName = topicName; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCont() { return cont; } public void setCont(String cont) { this.cont = cont; } }
Topic.java
package com.iflytek.HQL1; import java.util.Date; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; /** * @author xudongwang 2011-11-3 * */ @Entity public class Topic { private int id; private String title; private Category category; // private Category category2; private Date createDate; public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } @ManyToOne(fetch = FetchType.LAZY) public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
一、集合查询
Session session = sf.openSession(); session.beginTransaction(); // 这里使用的Query是org.hibernate.Query // 同时这里需要写的类名而不要写表名 Query q = session.createQuery("from Category"); List<Category> categories = (List<Category>) q.list(); for (Category c : categories) { System.out.println(c.getName()); } session.getTransaction().commit(); session.close();
说明:通过Session的CreateQuery方法创建一个Query对象,它包含一个HQL查询语句。
调用Query的list()方法执行查询语句,该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。
二、去重复排序
// distinct这里是和id的 Query q = session .createQuery("select distinct c from Category c order by c.name desc");
三、传参“:”:
Query q = session .createQuery("from Category c where c.id > :min and c.id < :max"); q.setParameter("min", 2); q.setParameter("max", 8); // 或 // q.setInteger("min", 2); // q.setInteger("max", 8); // 或 // Query q = session.createQuery( // "from Category c where c.id > :min and c.id < :max") // .setInteger("min", 2).setInteger("max", 8);//链式编程 List<Category> categories = (List<Category>) q.list();
四、传参“?”:
Query q = session .createQuery("from Category c where c.id > ? and c.id < ?"); q.setParameter(0, 2).setParameter(1, 8); // q.setParameter(1, 8);
五、分页:
Query q = session.createQuery("from Category c order by c.name desc"); q.setMaxResults(4); q.setFirstResult(2); // 这里所有使用参数的都可以使用链式编程
六、取对象指定字段:
// 上面去的都是对象,这里取的是字段,其返回值是Object类型的数组 Query q = session .createQuery("select c.id, c.name from Category c order by c.name desc"); List<Object[]> categories = (List<Object[]>) q.list(); for (Object[] o : categories) { System.out.println(o[0] + "-" + o[1]); }
// 为什么不能直接写Category名,而必须写t.category // 因为有可能存在多个成员变量(同一个类),需要指明用哪一个成员变量的连接条件来做连接 Query q = session .createQuery("select t.title, c.name from Topic t join t.category c "); // join for (Object o : q.list()) { Object[] m = (Object[]) o; System.out.println(m[0] + "-" + m[1]); }
七、多表查询中的fetch
// 设定fetch type 为lazy后将不会有第二条sql语句 // 两张表联合查询 Query q = session.createQuery("from Topic t where t.category.id = 1");
如果Topic中:
@ManyToOne(fetch = FetchType.LAZY) public Category getCategory() { return category; }
Hibernate: select topic0_.id as id2_, topic0_.category_id as category4_2_, topic0_.createDate as createDate2_, topic0_.title as title2_ from Topic topic0_ where topic0_.category_id=1
如果Topic中:
@ManyToOne public Category getCategory() { return category; }
select topic0_.id as id2_, topic0_.category_id as category4_2_, topic0_.createDate as createDate2_, topic0_.title as title2_ from Topic topic0_ where topic0_.category_id=1 Hibernate: select category0_.id as id0_0_, category0_.name as name0_0_ from Category category0_ where category0_.id=?
八、构造方法查询
// VO Value Object // DTO data transfer object Query q = session .createQuery("select new com.iflytek.QL1.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");
九、uniqueResult
Query q = session.createQuery("from Msg m where m = :MsgToSearch "); // 不重要,而QBE要比这个要灵活 Msg m = new Msg(); m.setId(1); q.setParameter("MsgToSearch", m); //如果有多个值抛错,如果有值且只有一个,返回一个object,如果没值,返回null Msg mResult = (Msg) q.uniqueResult();
十、聚合函数
1、count:
Query q = session.createQuery("select count(*) from Msg m"); // count(*)返回的是long类型 long count = (Long) q.uniqueResult();
2、max、min、avg、sum:
Query q = session .createQuery("select max(m.id), min(m.id), avg(m.id), sum(m.id) from Msg m"); Object[] o = (Object[]) q.uniqueResult(); System.out.println(o[0] + "-" + o[1] + "-" + o[2] + "-" + o[3]);
3、between and:
Query q = session.createQuery("from Msg m where m.id between 3 and 5");
4、in:
Query q = session.createQuery("from Msg m where m.id in (3,4, 5)");
5、is null 与 is not null:
Query q = session.createQuery("from Msg m where m.cont is not null");
6、is empty 与 is not empty:
Query q = session.createQuery("from Topic t where t.msgs is empty")
7、like:
// %表示0个或多个 Query q = session.createQuery("from Topic t where t.title like '%5'"); // _表示一个 Query q = session.createQuery("from Topic t where t.title like '_5'");
8、other
Query q = session.createQuery("select lower(t.title)," + "upper(t.title)," + "trim(t.title)," + "concat(t.title, '***')," + "length(t.title)" + " from Topic t "); Query q = session.createQuery("select abs(t.id)," + "sqrt(t.id)," + "mod(t.id, 2)" + " from Topic t "); Query q = session .createQuery("select current_date, current_time, current_timestamp, t.id from Topic t"); Query q = session .createQuery("from Topic t where t.createDate < :date"); q.setParameter("date", new Date()); Query q = session .createQuery("select t.title, count(*) from Topic t group by t.title having count(*) >= 1"); Query q = session .createQuery("from Topic t where t.id < (select avg(t.id) from Topic t)"); Query q = session .createQuery("from Topic t where t.id < ALL (select t.id from Topic t where mod(t.id, 2)= 0) "); // 用in 可以实现exists的功能 // 但是exists执行效率高 // t.id not in (1) Query q = session .createQuery("from Topic t where not exists (select m.id from Msg m where m.topic.id=t.id)"); // Query q = // session.createQuery("from Topic t where exists (select m.id from Msg m where m.topic.id=t.id)")
十一、更新
Query q = session.createQuery("update Topic t set t.title = upper(t.title)"); q.executeUpdate();
十二、NamedQueries
// 在topic类上加上 // @NamedQueries( { @NamedQuery(name = "topic.selectCertainTopic", query // = "from Topic t where t.id = :id") }) Query q = session.getNamedQuery("topic.selectCertainTopic"); q.setParameter("id", 5); Topic t = (Topic) q.uniqueResult();
十三、NativeSQL
//createSQLQuery使用数据库本身的sql语言,所以里面的category是表名了 SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class); List<Category> categories = (List<Category>) q.list();
相关推荐
MongoDB C++驱动程序(mongodb-cxx-driver)是用于与MongoDB数据库...在实际项目中,你可以利用这个驱动实现复杂的数据查询、聚合操作,以及数据导入导出等功能。同时,熟悉CMake构建系统也会提升你的跨平台开发能力。
apache-zookeeper-3.6.2-bin.tar apache-zookeeper-3.6.2-bin.tar apache-zookeeper-3.6.2-bin.tar apache-zookeeper-3.6.2-bin.tar apache-zookeeper-3.6.2-bin.tar apache-zookeeper-3.6.2-bin.tar apache-...
testing.jar`来搭建开发环境,然后根据`hibernate-reference.pdf`文档的指导,配置Hibernate的属性文件(如hibernate.cfg.xml),定义实体类和映射文件(如.hbm.xml或使用注解),编写HQL或Criteria查询,实现数据的...
它通过HQL(Hibernate Query Language)和Criteria API提供了强大的查询能力,同时支持JPA(Java Persistence API)规范。 二、Hibernate 3.6.2.Final特性 1. 支持多种数据库:包括MySQL、Oracle、PostgreSQL等,...
`apache-maven-3.6.2-bin.tar.gz` 是Apache Maven 3.6.2版本的二进制发行版,以tar.gz格式打包。这个压缩包包含了运行Maven所需的所有文件,包括可执行的JAR文件和其他支持文件。解压此文件后,用户可以将Maven配置...
赠送jar包:rocketmq-client-3.6.2.Final.jar; 赠送原API文档:rocketmq-client-3.6.2.Final-javadoc.jar; 赠送源代码:rocketmq-client-3.6.2.Final-sources.jar; 包含翻译后的API文档:rocketmq-client-...
`apache-maven-3.6.2-bin.zip` 是Apache Maven的3.6.2版本的二进制发行版,它不包含源码或其他分支,因此是针对那些只需要执行构建任务而不涉及开发或调试的用户。 Maven的核心概念是项目对象模型(Project Object ...
在“apache-maven-3.6.2”这个压缩包中,我们获得了Maven 3.6.2的完整版本。这个版本是Maven的一个稳定版本,包含了执行构建、解析依赖、生成文档以及执行各种构建任务所需的所有组件。 Maven 的工作流程主要围绕...
赠送jar包:rocketmq-client-3.6.2.Final.jar; 赠送原API文档:rocketmq-client-3.6.2.Final-javadoc.jar; 赠送源代码:rocketmq-client-3.6.2.Final-sources.jar; 包含翻译后的API文档:rocketmq-client-...
在"apache-maven-3.6.2.zip"这个压缩包中,用户可以获得Maven 3.6.2的完整安装包。这个版本包括了阿里云镜像配置,这意味着在使用Maven进行项目构建时,可以通过阿里云的镜像服务器来加速下载依赖库,提高效率。这...
在这个“apache-maven-3.6.2-bin”安装包中,包含了运行Maven所需的所有核心组件、插件和文档。 1. **Maven的基本概念**: Maven是基于项目对象模型(Project Object Model, POM)的概念,通过XML文件定义项目的...
v3.6.2 更新日志: 1.修复文件md5显示错误 2.修复无法上传 3.修复分享列表获取不到密码 4.更新上传、下载处理流程,优化重试的判断条件 5.更新download命令, 移除之前的-stream -share -locate等参数,新增-mode参数,...
《ksoap2-android-assembly-3.6.2-jar-with-dependencies:Android中的Web服务调用利器》 在移动应用开发中,有时我们需要与服务器进行数据交互,这时候Web服务接口就显得尤为重要。ksoap2-android-assembly-3.6.2-...
eclipse-sourceBuild-srcIncluded-3.6.2
3.6.2版本是lucene的3x中最大的版本,也是3x中最稳定的版本,因此建设使用该版本。如果还是使用3.6.0或3.6.1,更要升级到该版本...想下载源码包的,可以搜索源码包lucene-core-3.6.2-src.jar及lucene-queries-3.6.2.jar
kSOAP2-android 3.6.2是这个库的一个特定版本,它包含了对Android平台的优化和适配。这个版本可能包含了一些新特性、性能改进或者错误修复,以提供更好的稳定性和兼容性。更新到这个版本,开发者可以确保他们的应用...
apache-solr-3.6.2.zipapache-solr-3.6.2.zipapache-solr-3.6.2.zipapache-solr-3.6.2.zipapache-solr-3.6.2.zipapache-solr-3.6.2.zipapache-solr-3.6.2.zip
`kafka_2.13-3.6.2` 这个版本号表示的是Kafka的一个特定发行版,其中: - `2.13` 指的是Kafka与Scala版本的兼容性。Scala是一种多范式的编程语言,Kafka的API是用Scala编写的,因此这个数字表示的是与哪个版本的...
eclipse-SDK-3.6.2-win32.part3