💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 简介 Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式: * HQL语言 * 本地数据库的SQL语句 Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。 通过Query主要完成查询操作. 我们通过Query可以执行hql语句. ~~~ Query query=Session.createQuery(hql); ~~~ 下面这个可以执行sql语句 ~~~ SQLQUery sqlQuery=Session.createSQLQuery(sql); ~~~ SQLQuery是Query的子集 Query代表面向对象的一个 Hibernate查询操作。 在 Hibernate中,通常使用 session.createQuery()方法接受一个HQL语句,然后调用 Query的ist()或 uniqueResult()方法执行查询。 所谓的HQL是Hibernate Query Language缩写,其语法很像SQL语法,但它是完全面向对象的。 在 Hibernate中使用 Query对象的步骤,具体所示 1. 获得 Hibernate的 Session对象。 2. 编写HQL语句 3. 调用 session. createQuery创建查询对象。 4. 如果HQL语句包含参数,则调用 Query的 setXxx设置参数。 5. 调用 Query对象的 list()或 uniqueResult()方法执行查询。 了解了使用 Query对象的步骤后,接下来,通过具体示例来演示 Query对象的查询操作。 Query中除了使用list()方法查询全部数据外,还有其它一些常用方法,具体如下: * setter方法: Query接口中提供了一系列的 setter方法用于设置查询语句中的参数,针对不 同的数据类型,需要用到不同的 setter方法。 * iterator方法:该方法用于查询语句,返回的结果是一个 Iterator对象,在读取时只能按照 顺序方式读取,它仅把使用到的数据转换成Java实体对象。 * uniqueresult()方法:该方法用于返回唯一的结果,在确保只有一条记录的查询时可以使用 该方法。 * executeUpdate()方法:该方法是 Hibernate3的新特性,它支持HQL语句的更新和删除操作。 * setFirstResulto方法:该方法可以设置获取第一个记录的位置,也就是它表示从第几条记录 开始查询,默认从0开始计算。 * setMaxResult()方法:该方法用于设置结果集的最大记录数,通常与 setFirstResult()方法结合 使用,用于限制结果集的范围,以实现分页功能。 # 本地SQL **sql不会直接封装到实体对象,需要我们手动写代码才可以** 要想执行本地sql ~~~ SQLQuery sqlQuery=session.createSqlQuery(String sql); ~~~ 使用addEntity方法来将结果封装到指定的对象中,如果不封装,得到的是`List<Object[]>` 如果sql中有参数,我们使用setParameter方法完成参数传递。 如果结果就是一个可以使用uniqueResult()来得到一个单独对象 ~~~ //执行本地sql-查询全部 //执行select * from t_customer; SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer"); //List<Object[]> list = sqlQuery.list(); //System.out.println(list); //想要将结果封装到Customer对象中 sqlQuery.addEntity(Customer.class); List<Customer> list = sqlQuery.list(); System.out.println(list); ~~~ ~~~ //执行本地sql-条件查询 //执行select * from t_customer wherw name=?; SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer where name=?"); //对参数进行赋值 sqlQuery.setParameter(0, "姓名1"); //想要将结果封装到Customer对象中,就要用addEntity方法 sqlQuery.addEntity(Customer.class); //List<Customer> list = sqlQuery.list(); //System.out.println(list); Customer c = (Customer) sqlQuery.uniqueResult(); System.out.println(c); ~~~ --- 本地sql也支持命名查询 可以将sql语句定义在hbm文件中,也可以使用注解 ~~~ <sql-query name=""></sql-query> ~~~ 本地命名sql注解定义 ~~~ @NamedNativeQuery(name="findCustomer", query="select * from t_customer") public class Customer { ~~~ 执行这个命名sql会报异常 ~~~ Query query = session.getNamedQuery("findCustomer"); List list = query.list(); System.out.println(list); ~~~ ~~~ java,lang.ExceptionInInitializerError Caused by: org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported ~~~ 出现问题是,hibernate不知道执行sql如何封装 ~~~ @SqlResultSetMapping(name = "customerSetMapping", entities = {@EntityResult(entityClass = Customer.class, fields = { @FieldResult(name = "id", column = "id", @FieldResult(name = "name", column = "name")) })}) @NamedNativeQuery(name = "findCustomer", query = "select * from t_customer", resultSetMapping = "customerSetMapping") ~~~ # 条件查询 可以使用where关键字 ~~~ //查询name=姓名o的信息 //Query query = session.createQuery("from Customer where name = ?"); //无名参数 Query query = session.createQuery("from Customer where name=:myname"); //有名称参数 //要对参数进行赋值 //query.setParameter(0, "姓名o"); //对有名称参数进行赋值 query.setParameter("myname", "姓名o"); //List<Customer> list = query.list(); //System.out.println(list); //如果能保证结果就是唯一的,那么可以使用 Customer c = (Customer) query.uniqueResult(); System.out.println(c); ~~~ 无名称参数`from Customer where name=?` 对其进行赋值`query.setParameter(0, "张三")` 有名称参数`from Customer where name=:myname;` 对其进行赋值`query.setParameter("myname", "李四");` 如果查询结果可以保证就是唯一 的,我们可以使用 `query. uniqueResult()`来得到一个单独对象. # 多表操作 SQL多表操作 1. 交叉连接 `CROSS JOIN `会产生迪卡尔积 ~~~ SELECT * FROM t_customer CROSS JOIN t_order; ~~~ 2. 内连接 `INNER JOIN ON` ~~~ SELECT * FROM t_customer AS c INNER JOIN t_order AS o ON c.id=o.c_customer_id; ~~~ 使用内连接它只能将有关联的数据得到。 隐式内连接 使用 "逗号"将表分开,使用where来消除迪卡尔积 ~~~ SELECT * FROM t_customer AS c ,t_order o WHERE c.id=o.c_customer_id; ~~~ 3. 外连接 左外`LEFT OUTER JOIN` 右外`RIGHT OUTER JOIN`, OUTER可以省略 ~~~ SELECT * FROM t_customer c LEFT OUTER JOIN t_order o ON c.id=o.c_customer_id; ~~~