Hibernate的三种查询方式

1、Criteria 查询 ,Query  By Criteria ( QBC )JPA 规范中定义的一种查询方法,但是不推荐使用

2、HQL : Hibernate Query Language , Hibernate 查询语言 ( 建议使用 )

3、Native SQL : Native SQL Query , 使用原生 SQL 语句进行查询

4、OID:根据id查询某一条记录

  • <T> T get(Class<T> entityType,Serializable id) 从数据库汇总查询一条记录并封装成一个相应类型的Java对象

  默认不支持延迟加载,当id对应的数据不存在时返回null

  • <T> T load(Class<T> theClass,Serializable id)  从数据库汇总查询一条记录并封装成一个相应类型的Java对象

  默认支持延迟加载,当id对应的数据不存在时抛出ObjectNotFoundException

  • <T> T find(Class<T> entityClass, Object primaryKey)  从数据库汇总查询一条记录并封装成一个相应类型的Java对象    javax.persistence.EntityManager中的

   默认不支持延迟加载,当id对应的数据不存在时返回null

5、对象导航方式查询:一个对象关联一个集合(一对多),hibernate会自动检索关联集合的数据

  • 比如一个班级中有多个学生,在班级的持久类中定义了private Set<Student> students属性,可以通过班级持久化类可以获取students。

Hibernate Query Language

1、查询所有

package ecut.query.test.hql;

import java.lang.reflect.Array;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Clazz; public class TestHibernateQuery1 {
private SessionFactory factory ;
private Session session ; public @Before void init() {
// 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
Configuration config = new Configuration();
// 读取配置文件
config.configure("ecut/query/hibernate.cfg.xml");
//config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件 // 使用 Configuration 创建 SessionFactory
factory = config.buildSessionFactory(); // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
session = factory.openSession();
} /** 查询 Clazz 类 对应的表中的所有数据并 封装成 Clazz 对象 组成的 集合 */
public @Test void query1(){ String HQL = "FROM Clazz" ; // 建议 所有的 SQL 关键字 一律大写 // 通过 session 对象 来创建一个 查询器
// session.createQuery( HQL ); // 如果类型不明确,可以采用该方法
Query<Clazz> queryer = session.createQuery( HQL , Clazz.class ) ; // 如果类型能够确定,建议指定类型
System.out.println( "~~~~~~~~~~~~~~~~~~~" );
List<Clazz> list = queryer.list() ; // 执行查询操作 ( 与 queryer.getResultList() 功能 相似 )
System.out.println( list.size() ); for( Clazz c : list ){
System.out.println( c.getName() );
} } /** 查询 Clazz 类 对应的表中的所有数据并 封装成 Clazz 对象 组成的 集合 */
public @Test void query2(){ String HQL = "SELECT c FROM Clazz AS c" ; // 建议 所有的 SQL 关键字 一律大写 Query<Clazz> queryer = session.createQuery( HQL , Clazz.class ) ;
System.out.println( "~~~~~~~~~~~~~~~~~~~" );
List<Clazz> list = queryer.list() ; // 执行查询操作 for( Clazz c : list ){
System.out.println( c.getName() );
} } /** N + 1 问题 */
@SuppressWarnings("deprecation")
public @Test void query3(){ String HQL = "SELECT c FROM Clazz AS c" ; // 建议 所有的 SQL 关键字 一律大写 Query<Clazz> queryer = session.createQuery( HQL , Clazz.class ) ; System.out.println( "~~~~~~~~~~~~~~~~~~~" ); // 第一次查询 ( 查询所有的对象标识符 )
Iterator<Clazz> it = queryer.iterate(); // 执行查询操作 ( 但是 只获取 每个对象对应的 对象标识符 ) // 每循环一次 就查询一条记录 ( N )
while( it.hasNext() ){
Clazz c = it.next();
System.out.println( c.getId() + " : " + c.getName() );
} }
public @After void destory(){
session.close();
factory.close();
} }

HQL语句可以是SELECT c FROM  Clazz AS c 也可以将SELECT省略,除了可以使用list方法,也可以使用iterate方法(已过时)获取,每循环一次就查询一次记录,有N条记录就查询N次,调用iterate方法时也会调用一次查询获取所有对象的标识符,一共查询了N+1次即是N+1问题。

2、条件查询和排序查询

package ecut.query.test.hql;

import java.lang.reflect.Array;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Clazz; public class TestHibernateQuery1 {
private SessionFactory factory ;
private Session session ; public @Before void init() {
// 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
Configuration config = new Configuration();
// 读取配置文件
config.configure("ecut/query/hibernate.cfg.xml");
//config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件 // 使用 Configuration 创建 SessionFactory
factory = config.buildSessionFactory(); // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
session = factory.openSession();
} /** 使用 条件过滤 和 排序 */
public @Test void query4(){ String HQL = "FROM Clazz AS c WHERE c.id > 4 ORDER BY c.id DESC" ; Query<Clazz> queryer = session.createQuery( HQL , Clazz.class ) ; List<Clazz> list = queryer.list() ; // 执行查询操作 for( Clazz c : list ){
System.out.println( c.getId() + " : " + c.getName() );
} } public @After void destory(){
session.close();
factory.close();
} }

3、标量查询(投影查询)

package ecut.query.test.hql;

import java.lang.reflect.Array;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Clazz; public class TestHibernateQuery1 {
private SessionFactory factory ;
private Session session ; public @Before void init() {
// 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
Configuration config = new Configuration();
// 读取配置文件
config.configure("ecut/query/hibernate.cfg.xml");
//config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件 // 使用 Configuration 创建 SessionFactory
factory = config.buildSessionFactory(); // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
session = factory.openSession();
}
/** 标量查询: 查询单个属性 */
public @Test void query5(){ String HQL = "SELECT c.name FROM Clazz AS c" ; Query<String> queryer = session.createQuery( HQL , String.class) ; List<String> list = queryer.list() ; // 执行查询操作 for( String o : list ){
System.out.println( o );
} } /** 标量查询: 查询多个属性 */
public @Test void query6(){ String HQL = "SELECT c.id , c.name FROM Clazz AS c" ; Query<?> queryer = session.createQuery( HQL ) ; List<?> list = queryer.list() ; // 执行查询操作 for( Object o : list ){
Class<?> c = o.getClass(); // 获得当前元素的类型
if( c.isArray() ) {
int length = Array.getLength( o ); // 用 java.lang.reflect.Array 中的方法获取数组长度
// 用反射的方式遍历数组
for( int i = 0 ; i < length ; i ++ ){
Object e = Array.get( o , i ) ; // Object e = o[ i ] ;
System.out.print( e );
System.out.print( "\t");
}
System.out.println();
}
} } /** 标量查询: 查询多个属性 */
public @Test void query7(){ String HQL = "SELECT c.id , c.name FROM Clazz AS c" ; Query<Object[]> queryer = session.createQuery( HQL , Object[].class ) ; List<Object[]> list = queryer.list() ; // 执行查询操作 for( Object[] array : list ){
if( array == null || array.length == 0 ){
System.out.println( "没有数据" );
} else {
for( int i = 0 , n = array.length ; i < n ; i++ ){
Object e = array[ i ] ;
System.out.print( e + "\t" );
}
System.out.println();
}
} } /** 查询多个属性返回实体类型的对象 */
public @Test void query8(){ // String HQL = "SELECT new Clazz( c.id , c.name ) FROM Clazz AS c" ; String HQL = "SELECT new Clazz( c.name , c.id ) FROM Clazz AS c" ; Query<Clazz> queryer = session.createQuery( HQL ,Clazz.class ) ; List<Clazz> list = queryer.list() ; // 执行查询操作 for( Clazz c : list ){
if( c != null ) {
System.out.println( c.getId() + " : " + c.getName() );
}
} } /** 查询单个或多个属性,并返回 map 组成的 List 集合 */
@SuppressWarnings("rawtypes")
public @Test void query9(){ // 如果没有通过 AS 关键字指定 属性的 别名,
// 那么将来的 Map 集合中 key 是按照 属性出现的顺序对应的索引 ( 不是数字类型而是 String 类型 )
// String HQL = "SELECT new map( c.id , c.name ) FROM Clazz AS c WHERE c.id = 1 " ; // 使用 AS 关键字指定 属性的 别名 ,将的 Map 集合中 key 的名称就是这里的 别名
String HQL = "SELECT new map( c.id AS id , c.name AS name ) FROM Clazz AS c" ; Query<Map> queryer = session.createQuery( HQL ,Map.class ) ; List<Map> list = queryer.list() ; // 执行查询操作 for( Map map : list ){
System.out.println( map.get( "id" ) + " : " + map.get( "name" ) );
} /*
for( Map map : list ){
Set<Entry> entrySet = map.entrySet();
for ( Entry e : entrySet ){
//System.out.println( e.getKey() + " : " + e.getKey().getClass().getName() );
// System.out.println( e.getValue() + " : " + e.getValue().getClass().getName() );
System.out.println( e.getKey() + " : " + e.getValue() ); }
}
*/ } public @After void destory(){
session.close();
factory.close();
} }

标量查询返回的是由Object数组组成的List集合,可以利用反射去进行遍历。也可以将字段封装到对象中,使用SELECT new Clazz( c.id , c.name ) FROM Clazz AS c这种格式的HQL,并需要在持久化类中指定与之对应的有参构造,才可以完成封装。或者将对象封装到一个map(本质是HashMap,但是HQL中只能写Map)中。

4、多表查询

package ecut.query.test.hql;

import java.lang.reflect.Array;
import java.util.List; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Clazz;
import ecut.query.entity.Student; public class TestHibernateQuery2 {
private SessionFactory factory ;
private Session session ; public @Before void init() {
// 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
Configuration config = new Configuration();
// 读取配置文件
config.configure("ecut/query/hibernate.cfg.xml");
//config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件 // 使用 Configuration 创建 SessionFactory
factory = config.buildSessionFactory(); // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
session = factory.openSession();
} /** 使用 表连接进行查询 ( 内连接 ) */
public @Test void query10(){ // select * from t_class c , t_student s where c.id = s.class_id ;
// select * from t_class c inner join t_student s on c.id = s.class_id ;
// select * from t_class c cross join t_student s where c.id = s.class_id ;
String HQL = "FROM Clazz AS c , Student AS s WHERE c.id = s.clazz.id" ; Query<?> queryer = session.createQuery( HQL ); List<?> list = queryer.list(); System.out.println( list.size() ); for( Object o : list ){
Class<?> c = o.getClass();
if( c.isArray() ){
final int length = Array.getLength( o ) ;
for( int i = 0 ; i < length ; i ++ ){
Object e = Array.get( o , i ) ; // Object e = o[ i ] ;
System.out.print( e + "\t" );
}
System.out.println();
}
} } /** 连接查询 ( Clazz 对应表 跟 Clazz 中 students 对应的表 进行连接 ) */
public @Test void query11(){ // select * from t_class c inner join t_student s on c.id = s.class_id ;
String HQL = "FROM Clazz AS c JOIN c.students" ; Query<?> queryer = session.createQuery( HQL ); List<?> list = queryer.list(); System.out.println( list.size() ); for( Object o : list ){
Class<?> c = o.getClass();
if( c.isArray() ){
final int length = Array.getLength( o ) ;
for( int i = 0 ; i < length ; i ++ ){
Object e = Array.get( o , i ) ; // Object e = o[ i ] ;
System.out.print( e + "\t" );
}
System.out.println();
}
} } /** 连接查询 ( 使用 fetch 关键字 ) */
public @Test void query12(){ // 使用 fetch 关键字后,下面的 HQL 语句执行后返回 由 Clazz 对象组成的 List 集合
// Student 对象被自动添加到 相应 的班级对象的 students 集合中
String HQL = "FROM Clazz AS c JOIN fetch c.students" ; Query<Clazz> queryer = session.createQuery( HQL , Clazz.class ); List<Clazz> list = queryer.list(); System.out.println( list.size() ); for( Clazz c : list ){
System.out.println( c.getName() + " : " + c.getStudents().size() );
} } /** 使用 DISTINCT 剔除重复数据 */
public @Test void query13(){ String HQL = "SELECT DISTINCT c FROM Clazz AS c JOIN fetch c.students" ; Query<Clazz> queryer = session.createQuery( HQL , Clazz.class ); List<Clazz> list = queryer.list(); System.out.println( list.size() ); for( Clazz c : list ){
System.out.println( c.getName() + " : " + c.getStudents().size() );
} } /** 使用左外连接: 查询所有班级 及 各班级的学生 ( 暂时没有学生的班级也列出来 ) */
public @Test void query14(){
//SELECT * FROM t_class c LEFT JOIN t_student AS s ON s.class_id = c.id
String HQL = "SELECT DISTINCT c FROM Clazz AS c LEFT JOIN fetch c.students" ; Query<Clazz> queryer = session.createQuery( HQL , Clazz.class ); List<Clazz> list = queryer.list(); System.out.println( list.size() ); for( Clazz c : list ){
System.out.println( c.getName() + " : " + c.getStudents().size() );
} } /** 使用左外连接: 查询每个学生及其班级信息,如果某个学生没有明确班级,也列出来 */
public @Test void query15(){ String HQL = "FROM Student AS s LEFT OUTER JOIN fetch s.clazz" ; Query<Student> queryer = session.createQuery( HQL , Student.class ); List<Student> list = queryer.list(); System.out.println( list.size() ); for( Student c : list ){
System.out.println( c.getName() + " : " + c.getClazz() );
} } public @After void destory(){
session.close();
factory.close();
} }

使用迫切内连接(fetch 关键字)后,执行返回 由 Clazz 对象组成的 List 集合,Student 对象被自动添加到 相应 的班级对象的 students 集合中,而不是默认返回的object[]。另外可以使用DISTINCT 删除重复数据。HQL中使用LEFT OUTER JOIN来实现左连接。

5、HQL参数传递

  • 使用 ? 做参数占位符

    package ecut.query.test.hql;
    
    import java.util.List;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.query.Query;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import ecut.query.entity.Student; public class TestHibernateQuery3 {
    private SessionFactory factory ;
    private Session session ; public @Before void init() {
    // 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
    Configuration config = new Configuration();
    // 读取配置文件
    config.configure("ecut/query/hibernate.cfg.xml"); //config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件 // 使用 Configuration 创建 SessionFactory
    factory = config.buildSessionFactory(); // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
    session = factory.openSession();
    } /** 使用 ? 做参数占位符 */
    public @Test void query16(){ String HQL = "FROM Student AS s WHERE s.id BETWEEN ? AND ? " ; Query<Student> queryer = session.createQuery( HQL , Student.class ); queryer.setParameter( 0 , 5 ); // JDBC是从1开始,HQL的参数占位符的索引从 0 开始
    queryer.setParameter( 1 , 10 ); List<Student> list = queryer.list(); System.out.println( list.size() ); for( Student c : list ){
    System.out.println( c.getId() + " : " + c.getName() );
    } }
    public @After void destory(){
    session.close();
    factory.close();
    } }

    JDBC是从1开始,HQL的参数占位符的索引从 0 开始。

  • 使用 命名 参数占位符
    package ecut.query.test.hql;
    
    import java.util.List;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.query.Query;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import ecut.query.entity.Student; public class TestHibernateQuery3 {
    private SessionFactory factory ;
    private Session session ; public @Before void init() {
    // 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
    Configuration config = new Configuration();
    // 读取配置文件
    config.configure("ecut/query/hibernate.cfg.xml"); //config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件 // 使用 Configuration 创建 SessionFactory
    factory = config.buildSessionFactory(); // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
    session = factory.openSession();
    }
    /** 使用 命名 参数占位符 */
    public @Test void query17(){ String HQL = "FROM Student AS s WHERE s.id BETWEEN :start AND :end " ; Query<Student> queryer = session.createQuery( HQL , Student.class ); queryer.setParameter( "start" , 5 ); // 参数占位符的索引从 0 开始
    queryer.setParameter( "end" , 10 ); List<Student> list = queryer.list(); System.out.println( list.size() ); for( Student c : list ){
    System.out.println( c.getId() + " : " + c.getName() );
    } } public @After void destory(){
    session.close();
    factory.close();
    } }

6、HQL实现更新和删除

package ecut.query.test.hql;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Student; public class TestHibernateQuery4 {
private SessionFactory factory ;
private Session session ; public @Before void init() {
// 创建一个 Configuration 对象,用来读取配置文件 ( 默认位置、默认名称 )
Configuration config = new Configuration();
// 读取配置文件
config.configure("ecut/query/hibernate.cfg.xml"); //config.configure(); // 读取 默认位置 ( 当前 classpath ) 的 默认名称 ( hibernate.cfg.xml ) 的配置文件 // 使用 Configuration 创建 SessionFactory
factory = config.buildSessionFactory(); // 创建 Session 对象 ( 这里的 Session 是 Java 程序 跟 数据库 之间的 会话 )
session = factory.openSession();
} /** 使用 HQL 方式支持 update */
public @Test void update(){ //String HQL = "UPDATE Student AS s SET s.name = ? WHERE id = ? " ;
String HQL = "UPDATE Student AS s SET s.name = :name WHERE s.id = :id " ; Query<?> queryer = session.createQuery( HQL ); queryer.setParameter( "name" , "张无忌" );
queryer.setParameter( "id" , 2 ); session.getTransaction().begin(); int count = queryer.executeUpdate(); session.getTransaction().commit(); System.out.println( "受影响的记录数: " + count ); } /** 使用 HQL 方式支持 delete */
public @Test void delete(){ String HQL = "DELETE FROM Student AS s WHERE s.id = :id " ; Query<?> queryer = session.createQuery( HQL ); queryer.setParameter( "id" , 8 ); session.getTransaction().begin(); int count = queryer.executeUpdate(); session.getTransaction().commit(); System.out.println( "受影响的记录数: " + count ); } /** 使用 HQL 方式不支持 insert into */
public @Test void insert(){ // 错误: String HQL = "INSERT INTO Student ( id , name ) VALUES ( ? , ? )" ; Student s = new Student();
s.setName( "林平之" ); session.getTransaction().begin();
session.save( s );
session.getTransaction().commit(); } public @After void destory(){
session.close();
factory.close();
} }

HQL 支持更新和删除,但是不支持插入。

Native SQL Query

1、标量查询(投影查询)

package ecut.query.test.sql;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.NativeQuery;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Clazz; public class TestNativeSQLQuery { private SessionFactory factory ;
private Session session ; public @Before void init() { Configuration config = new Configuration();
config.configure("ecut/query/hibernate.cfg.xml"); //config.configure(); factory = config.buildSessionFactory(); session = factory.openSession();
}
//标量查询
public @Test void query1(){ String SQL = "SELECT id , name FROM t_class" ; // SQLQuery queryer = session.createSQLQuery( SQL ); // 过时
// NativeQuery<?> queryer = session.createNativeQuery( SQL );
NativeQuery<Object[]> queryer = session.createNativeQuery( SQL , Object[].class ); List<Object[]> list = queryer.list(); for( Object[] o : list ){
System.out.println( o[ 0 ] + " : " + o[ 1 ]);
} } public @Test void query2(){ String SQL = "SELECT name FROM t_class" ; NativeQuery<?> queryer = session.createNativeQuery( SQL ); List<?> list = queryer.list(); for( Object o : list ){
System.out.println( o + " : " + o.getClass().getName() );
} } /** 执行 SQL 语句并将结果集中的数据 封装到 指定的实体类型的对象中 */
public @Test void query3(){ String SQL = "SELECT id , name FROM t_class" ; NativeQuery<Clazz> queryer = session.createNativeQuery( SQL , Clazz.class ); List<Clazz> list = queryer.list(); for( Clazz c : list ){
System.out.println( c.getId() + " : " + c.getName() ) ;
} }
public @After void destory(){
session.close();
factory.close();
} }

可以在List中指定具体的类型实现对字段的封装,不再是保存为Object数组。

2、排序查询

package ecut.query.test.sql;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.NativeQuery;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Clazz; public class TestNativeSQLQuery { private SessionFactory factory ;
private Session session ; public @Before void init() { Configuration config = new Configuration();
config.configure("ecut/query/hibernate.cfg.xml"); //config.configure(); factory = config.buildSessionFactory(); session = factory.openSession();
}
/** 使用 ? 做参数占位符 */
public @Test void query4(){ String SQL = "SELECT id , name FROM t_class WHERE id > ? ORDER BY id DESC" ; NativeQuery<Clazz> queryer = session.createNativeQuery( SQL , Clazz.class ); queryer.setParameter( 1 , 5 ); // 执行 SQL 语句跟 执行 HQL 语句不同,这里的索引跟JDBC一致,从 1 开始 List<Clazz> list = queryer.list(); for( Clazz c : list ){
System.out.println( c.getId() + " : " + c.getName() ) ;
} } /** 使用 命名 参数占位符 */
public @Test void query5(){ String SQL = "SELECT id , name FROM t_class WHERE id > :id ORDER BY id DESC" ; NativeQuery<Clazz> queryer = session.createNativeQuery( SQL , Clazz.class ); queryer.setParameter( "id" , 5 ); List<Clazz> list = queryer.list(); for( Clazz c : list ){
System.out.println( c.getId() + " : " + c.getName() ) ;
} }
public @After void destory(){
session.close();
factory.close();
} }

SQL中也可以通过使用?做参数占位符和使用命名参数占位符,但是与HQL不同的是SQL和JDBC一样参数占位符的索引从 1 开始。

3、SQL实现更新、插入和删除操作

package ecut.query.test.sql;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.NativeQuery;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ecut.query.entity.Clazz; public class TestNativeSQLQuery { private SessionFactory factory ;
private Session session ; public @Before void init() { Configuration config = new Configuration();
config.configure("ecut/query/hibernate.cfg.xml"); //config.configure(); factory = config.buildSessionFactory(); session = factory.openSession();
}
public @Test void insert(){ String SQL = "INSERT INTO t_class ( id , name ) VALUES ( :id , :name )" ; NativeQuery<?> queryer = session.createNativeQuery( SQL ); queryer.setParameter( "id" , 8 );
queryer.setParameter( "name" , "计算机科学技术" ); session.getTransaction().begin();
int count = queryer.executeUpdate();
System.out.println( count );
session.getTransaction().commit(); } public @Test void update(){ String SQL = "UPDATE t_class SET name = :name WHERE id = :id" ; NativeQuery<?> queryer = session.createNativeQuery( SQL ); queryer.setParameter( "id" , 8 );
queryer.setParameter( "name" , "大数据与云计算" ); session.getTransaction().begin();
int count = queryer.executeUpdate();
System.out.println( count );
session.getTransaction().commit(); } public @Test void delete(){ String SQL = "DELETE FROM t_class WHERE id = :id" ; NativeQuery<?> queryer = session.createNativeQuery( SQL ); queryer.setParameter( "id" , 8 ); session.getTransaction().begin();
int count = queryer.executeUpdate();
System.out.println( count );
session.getTransaction().commit(); } public @After void destory(){
session.close();
factory.close();
} }

SQL可以实现插入操作但是HQL无法实现插入操作。

转载请于明显处标明出处:

https://www.cnblogs.com/AmyZheng/p/9324192.html

Hibernate学习(六)的更多相关文章

  1. Hibernate学习六----------CRUD

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  2. hibernate学习 六 Hibernate缓存

    缓存: 如果在集群环境下使用Hibernate时,(集群有节点A ,节点B) 当请求,发往A节点,A在数据库中修改了一条记录,然后节点B的缓存中如何实时的更新节点A修改的新数据          hi ...

  3. Hibernate学习---缓存机制

    前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢. 在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我 ...

  4. Hibernate学习之——搭建log4j日志环境

    昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...

  5. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  6. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  7. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  8. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  9. TweenMax动画库学习(六)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  10. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

随机推荐

  1. Centos7 切换 yum 源

    # yum install lrzsz修改CentOS默认yum源为mirrors.aliyun.com1.首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.r ...

  2. Mysql 函数定义及批量数据脚本

    零.说在前面 在定义函数之前 需要先将 log_bin_trust_function_creators 值设为开启,原因如下 在主从复制的两台Mysql服务器中,slaver会从master复制数据, ...

  3. Java下载文件时文件名中的中文变成下划线,其他正常

    将 utf-8 转换成 ISO8859-1 编码 response.addHeader("Content-Disposition", "attachment;filena ...

  4. linux 内存,cpu占用最高进程查询

    1. 可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 2. 可以使用一下命令查使用CPU最多的10个进程 ps -aux | sort ...

  5. js实现左右自动滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. bugku 多种方法解决

    首先打开链接发现是一个exe文件 实在是想不出办法了 只能回去看提示 说会有一张图片 不知道怎么就打开了hxd 然后拖进去 发现了一串 用图片base64加密的码 然后在网页中找到 解码 工具 htt ...

  7. git 初次push

    1.本地仓库与远程仓库第一次同步时,一直同步不上 最后 git status ,发现有两个文件没提交 提交后再push即可 2.如果不行,再看一下其他情况

  8. jmeter实现服务器端后台接口性能测试

    实现目的 在进行服务器端后台接口性能测试时,需要连接到Linux服务器端,然后通过命令调用socket接口,这个过程就需要用到jmeter的SSH Command取样器实现了. 脚本实现 设置CSV ...

  9. Vue - 实现双击显示编辑框;自动聚焦点击的显示框;点击编辑框外的地方,隐藏编辑框

    实现这三个功能的踩坑记录. 1. 需求 在Vue中,有一个input, 双击时编辑文本,点击该input节点外的其他地方,则取消编辑. 那么这里有三个要实现的地方 第一是双击显示编辑框. 第二是自动聚 ...

  10. AI人工智能之基于OpenCV+face_recognition实现人脸识别

    因近期公司项目需求,需要从监控视频里识别出人脸信息.OpenCV非常庞大,其中官方提供的人脸模型分类器也可以满足基本的人脸识别,当然我们也可以训练自己的人脸模型数据,但是从精确度和专业程度上讲Open ...