一、测试load与get
默认配置下,load将实现懒加载,即只有当对象被使用的时候才发出sql,而get将立刻发出sql
如下:
POJO:
package com.lwf.hibernate;
import java.util.Date;
public class Doc {
private String id;
private String name;
private Date createDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
配置文件:
<?xml version="1.0"?>
<!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.lwf.hibernate.Doc">
<id name="id">
<generator class="uuid"></generator>
</id>
<property name="name"></property>
<property name="createDate"></property>
</class>
<query name="HqlName">
<![CDATA[select id,name from Doc]]>
</query>
<query name="HqlNameAll">
<![CDATA[from Doc order by name desc]]>
</query>
<query name="HqlNameAllParam">
<![CDATA[from Doc where name=:name]]>
</query>
</hibernate-mapping>
测试代码:
package com.lwf.hibernate;
import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class DocSessionTest {
public static void main(String[] args) {
// testSave();
testGet();
//testLoad();
}
public static void commit(Session session){
try {
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
public static void closeSession(Session session){
if(session.isOpen()){
session.close();
}
}
public static Session getSession(){
Session session = null;
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
session = factory.openSession();
return session;
}
public static void testSave(){
Session session = null;
session = getSession();
session.beginTransaction();
Doc doc = new Doc();
session.save(doc);
doc.setName("gdgdgd");
doc.setCreateDate(new Date());
session.flush();
commit(session);
closeSession(session);
}
public static void testGet(){
Session session = null;
session = getSession();
session.beginTransaction();
Doc doc = (Doc)session.get(Doc.class, "402880f62861314e0128613157060001");
//get会立刻发出查询语句,而load则不会立刻发出查询,直到后面有使用doc如doc.setName才进行查询.
//System.out.println(doc.getName());
//doc.setName("t");
session.flush();
commit(session);
closeSession(session);
}
public static void testLoad(){
Session session = null;
session = getSession();
session.beginTransaction();
//get会立刻发出查询语句,而load则不会立刻发出查询,直到后面有使用doc如doc.setName才进行查询.
//load方法实现了lazy即懒模式
Doc doc =(Doc)session.load(Doc.class, "40288e81280b1db101280b1db61c0001");
//System.out.println(doc.getName());
//doc.setName("t");
session.flush();
commit(session);
closeSession(session);
}
}
运行代码会发现load与get的不同。
另外,如果没有查询到数据,get会返回null,而load回返回异常
二、下例中对HQL的各种情况的查询,删除进行演示
package com.lwf.hibernate;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class DocSqlTest {
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
session.beginTransaction();
//where子句中使用值传递
String sqlStr = "from Doc where name ='we'";
getDocList(session,sqlStr);
//where子句中使用参数传递,参数通过query.setString(paramName,paramVal);设置
sqlStr = "from Doc where name =:name";
Object[] object = new Object[2];
object[1] = "yeeey";
getDocList(session,sqlStr,object);
//where子句中使用参数传递,参数通过query.setProperties(object);设置
sqlStr = "from Doc where name =:name";
Doc doc = new Doc();
doc.setName("Lisi1");
getDocList(session,sqlStr,doc);
//通过sqlStr字符串设定的查询条件进行查询
sqlStr = "select id,name from Doc";
getDocObject(session,sqlStr);
//通过从配置文件中获得查询语句进行查询
getDocBynameQuery(session);
//get getObjectBynameQuery
getObjectBynameQuery(session);
//get getDocBynameQueryParam
getDocBynameQueryParam(session);
//只获得一笔记录
sqlStr = "from Doc";
getSingleData(session,sqlStr);
//通过改变查询条件进行查询。
sqlStr = "from Doc where lower(name)='df'";
getDocList(session,sqlStr);
sqlStr = "from Doc where name not in ('we','df')";
getDocList(session,sqlStr);
sqlStr = "from Doc where name like '_e%'";
getDocList(session,sqlStr);
//获得总记录数
sqlStr = "select count(*) from Doc";
Long l = (Long)session.createQuery(sqlStr).uniqueResult();
System.out.println(l);
//测试group by子名
sqlStr = "select name from Doc group by name having name is not null";
getDocName(session,sqlStr);
session.getTransaction().commit();
session.flush();
if(session.isOpen()){
session.close();
}
//测试删除表记录
session = factory.openSession();
session.beginTransaction();
Query query = session.createQuery("delete from Doc");
query.executeUpdate();
session.getTransaction().commit();
if(session.isOpen()){
session.close();
}
}
public static void getSingleData(Session session,String sqlStr){
Query query = session.createQuery(sqlStr);
query.setFirstResult(0);
query.setMaxResults(1);
Object object = query.uniqueResult();
System.out.println(((Doc)object).getId() + " : " + ((Doc)object).getName());
}
public static void getDocBynameQueryParam(Session session){
Query query = session.getNamedQuery("HqlNameAllParam");
query.setString("name", "we");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Doc doc = (Doc)list.get(i);
String id = doc.getId();
String name = doc.getName();
System.out.println(id +" : "+ name);
}
}
public static void getDocBynameQuery(Session session){
Query query = session.getNamedQuery("HqlNameAll");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Doc doc = (Doc)list.get(i);
String id = doc.getId();
String name = doc.getName();
System.out.println(id +" : "+ name);
}
}
public static void getObjectBynameQuery(Session session){
Query query = session.getNamedQuery("HqlName");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Object[] object = (Object[])list.get(i);
System.out.println(object[0] + " <:> " + object[1]);
}
}
public static void getDocList(Session session,String sqlStr,Object object){
Query query = session.createQuery(sqlStr);
query.setProperties(object);
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Doc doc = (Doc)list.get(i);
String id = doc.getId();
String name = doc.getName();
System.out.println(id +" : "+ name);
}
}
public static void getDocList(Session session,String sqlStr, Object[] parameter){
Query query = session.createQuery(sqlStr);
query.setString("name", (String)parameter[1]);
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Doc doc = (Doc)list.get(i);
String id = doc.getId();
String name = doc.getName();
System.out.println(id +" : "+ name);
}
}
public static void getDocList(Session session,String sqlStr){
Query query = session.createQuery(sqlStr);
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Doc doc = (Doc)list.get(i);
String id = doc.getId();
String name = doc.getName();
System.out.println(id +" : "+ name);
}
}
public static void getDocObject(Session session,String sqlStr){
Query query = session.createQuery(sqlStr);
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Object[] object = (Object[])list.get(i);
System.out.println(object[0] + " <:> " + object[1]);
}
}
public static void getDocName(Session session,String sqlStr){
Query query = session.createQuery(sqlStr);
List list = query.list();
for (int i = 0; i < list.size(); i++) {
String name = (String)list.get(i);
System.out.println(name);
}
}
}
分享到:
相关推荐
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...
标签“hibernate中get和lo”暗示了标签可能被意外截断,但我们可以推断完整标签可能是“hibernate中get和load的区别”。 在实际开发中,选择使用`get`还是`load`取决于具体需求。如果需要立即从数据库中获取对象,...
本文将深入探讨`get`与`load`两种方法的区别及其应用场景。 #### 一、基本概念 在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存...
在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...
本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的区别: 1. **返回结果对比**: - `load`方法如果找不到对应的记录,会抛出`org.hibernate....
2. 通过标识符检索:使用 session.get() 方法或 session.load() 方法根据标识符检索对象。 3. 使用 HQL 检索对象:使用 Hibernate 查询语言 HQL 检索对象。 4. 使用 Hibernate 条件 API:提供了类型安全的面向对象的...
在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...
而`get()`和`load()`用于根据主键获取对象,`update()`和`merge()`用于更新对象,`delete()`则用于删除对象。 6. **HQL与Criteria查询** Hibernate 提供了自己的SQL方言——HQL(Hibernate Query Language),它是...
本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...
- 通过Session创建或加载实体,调用save()、update()、delete()、get()、load()等方法 - 提交事务,关闭Session 对于proxool的整合,我们需要在hibernate.cfg.xml中添加proxool的相关配置,如pool_size、driver_...
在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...
Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get...
Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...
- `findById(id)`: 根据ID查询单个对象,利用`Session`的`get()`或`load()`方法。 - `findByExample(entity)`: 基于实例属性的查询,`Session`的`createCriteria()`可以接受对象实例,根据其属性构建查询条件。 ...
### Hibernate查询:get()与load() #### get()与load()的区别 - **get()** 方法在一级缓存中查找实体,如果找不到,则直接查询数据库,不会检查二级缓存。这意味着,当一级缓存中不存在所需数据时,get()会立即...