写一个关于hibernate的sql和hql语句实现增删改查,**注意:**hibernate的hql语句是不能实现insert的,所以和我一样有强迫症的一定要把这两者写在一起比较的不要纠结了。
至于原因:因为Hibernate的HQL语言是用于面向对象实现查询功能的,然而在插入操作中是不会牵涉任何查询动作的,所以HQL不能用于insert语句的插入操作。
实体类我就不上传了,就涉及两个,Category和Meg两个实体
hql与sql的区别
sql 面向数据库表查询
hql 面向对象查询
hql : from 后面跟的 类名+类对象 where 后 用 对象的属性做条件
sql: from 后面跟的是表名 where 后 用表中字段做条件查询
一定要注意语句中的表名和类对象不要能混了。
获取sessionfactory的util类
package com.java.Test;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class HibernateUtil {
private static SessionFactory sessionFactory = null;
public static SessionFactory getSessionFactory(){
if(sessionFactory==null) {
Configuration config = new Configuration();
sessionFactory = config.configure().buildSessionFactory();
}
return sessionFactory;
}
}
测试类,使用Junit
package com.java.Test;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.junit.Test;
import com.java.entiry.Category;
import com.java.entiry.Meg;
import com.java.entiry.Topic;
public class Testquery {
@Test
public void testSave() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
for (int i = 0; i < 10; i++) {
Category c = new Category();
c.setName("c" + i);
session.save(c);
}
for (int i = 0; i < 10; i++) {
Category c = new Category();
c.setId(1);
Topic t = new Topic();
t.setCategory(c);
t.setName("t" + i);
t.setCreateDate(new Date());
session.save(t);
}
for (int i = 0; i < 10; i++) {
Topic t = new Topic();
t.setId(1);
Meg m = new Meg();
m.setCont("m" + i);
m.setTopic(t);
session.save(m);
}
session.getTransaction().commit();
}
// 通过hql语句方式来进行查询
@Test
public void testquerybyhql() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String hql = "from Category c where c.name>'c5'";
Query q = session.createQuery(hql);
List<Category> lists = q.list();
for (Category category : lists) {
System.out.println(category.getName());
}
}
// 通过sql语句方式来进行查询
@Test
public void testquerybysql() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String sql = "select * from category c where c.name>'c5' ";
SQLQuery query = session.createSQLQuery(sql).addEntity(Category.class);// 记得要加上这个
List<Category> lists = query.list();
for (Category category : lists) {
System.out.println(category.getName());
}
}
// 使用hql 更新
@Test
public void testupdate() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String hql = "update Category set name=:name where id=:id";
session.createQuery(hql).setParameter("name", "sss").setParameter("id", 1).executeUpdate();
session.getTransaction().commit();
}
// 使用sql 更新
@Test
public void testupdate1() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
String sql = "update category set name=:name where id=:id";
session.beginTransaction();
session.createSQLQuery(sql).setParameter("name", "sql").setParameter("id", 2).executeUpdate();
session.getTransaction().commit();
}
@Test
// delete by hql
public void testdelete() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String hql = "delete Meg where id=?";
session.createQuery(hql).setInteger(0, 1).executeUpdate();
session.getTransaction().commit();
}
@Test
// delete by sql
public void testdelete1() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String sql = "delete from meg where id=:id";
session.createSQLQuery(sql).setParameter("id", 2).executeUpdate();
session.getTransaction().commit();
}
// test insert by sql
@Test
public void testinsert() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
String sql = "insert into meg(cont,topic_id) values(?,?)";
session.createSQLQuery(sql).setParameter(0, "m10").setParameter(1, 1).executeUpdate();
session.getTransaction().commit();
}
// test insert by hql 无法实现
@Test
public void testlazy() {
// 设定fetch type 为lazy后将不会有第二条sql语句
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Topic t where t.category.id = 1");
List<Topic> topics = (List<Topic>) q.list();
for (Topic t : topics) {
System.out.println(t.getName());
//System.out.println(t.getCategory().getName());
}
}
}