本文共 12255 字,大约阅读时间需要 40 分钟。
HQL(Hibernate Query Language)是hibernate自带的查询语言,进行了面向对象的分装,今天就来学习一下,
新建一个java项目,结构如下:
jar包和hibernate官网使用,参见《》
实体类Book代码:
package com.myeclipse.pojo;import java.util.Date;public class Book { private int id; private String author; private String name; private double price; private Date pubDate; private Category category; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Date getPubDate() { return pubDate; } public void setPubDate(Date pubDate) { this.pubDate = pubDate; } public Category getCategory() { return category; } public void setCategory(Category category) { this.category = category; } @Override public String toString() { return "Book [id=" + id + ", author=" + author + ", name=" + name + ", price=" + price + ", pubDate=" + pubDate + "]"; } }Book.hbm.xml代码如下:
Category实体类代码:
package com.myeclipse.pojo;import java.util.HashSet;import java.util.Set;public class Category{ private int id; private String name; private SetCategory.hbm.xml代码如下:books = new HashSet (); 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; } public Set getBooks() { return books; } public void setBooks(Set books) { this.books = books; }}
hibernate.cfg.xml代码:
com.mysql.jdbc.Driver jdbc:mysql:///hibernate4 root root org.hibernate.dialect.MySQL5Dialect true true update
HibernateUtil代码:
package com.robert.util;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.boot.registry.StandardServiceRegistryBuilder;import org.hibernate.cfg.Configuration;/** * hibernate工具类 */public class HibernateUtil { private static Configuration cfg = null; private static SessionFactory factory = null; private static Session session = null ; static { init(); } /** * 初始化获得Configuration和SessionFacroty对象 */ public static void init() { cfg = new Configuration().configure(); factory = cfg.buildSessionFactory(new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build()); } /** * 获得Session对象 * @return */ public static Session getSession() { if (factory != null){ return session = factory.openSession(); } init(); return session = factory.openSession(); } /** * 关闭Session */ public static void closeSession() { if(session!=null && session.isOpen()) session.close(); }}HibernateTest测试类代码,包含创建数据库表,保存数据,查询
package com.ghibernate.test;import java.util.Date;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport;import org.junit.Test;import com.myeclipse.pojo.Book;import com.myeclipse.pojo.Category;import com.robert.util.HibernateUtil;public class HibernateTest { @Test public void testCreateDB() { Configuration cfg = new Configuration().configure(); SchemaExport se = new SchemaExport(cfg); // 第一个参数:是否生成ddl脚本 // 第二个参数:是否执行到数据库中 se.create(true, true); } @Test public void testSave() { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Category category = new Category(); category.setName("文学"); Category category1 = new Category(); category1.setName("历史"); Category category2 = new Category(); category2.setName("仙侠"); Category category3 = new Category(); category3.setName("科幻"); Category category4 = new Category(); category4.setName("恐怖"); Book book = new Book(); book.setName("读者"); book.setPrice(5.6); book.setAuthor("众人"); book.setPubDate(new Date()); book.setCategory(category); Book book1 = new Book(); book1.setName("傲慢与偏见"); book1.setPrice(80.0); book1.setAuthor("简.奥斯汀"); book1.setPubDate(new Date()); book1.setCategory(category1); Book book2 = new Book(); book2.setName("中国历史"); book2.setPrice(30.0); book2.setAuthor("人民出版社"); book2.setPubDate(new Date()); book2.setCategory(category1); Book book3 = new Book(); book3.setName("翩眇之旅"); book3.setPrice(70.0); book3.setAuthor("萧鼎"); book3.setPubDate(new Date()); book3.setCategory(category2); Book book4 = new Book(); book4.setName("蓝血人"); book4.setPrice(60.0); book4.setAuthor("卫斯理"); book4.setPubDate(new Date()); book4.setCategory(category3); Book book5 = new Book(); book5.setName("我的大学"); book5.setPrice(60.5); book5.setAuthor("高尔基"); book5.setPubDate(new Date()); book5.setCategory(category); session.save(book); session.save(book1); session.save(book2); session.save(book3); session.save(book4); session.save(book5); session.save(category4); tx.commit(); HibernateUtil.closeSession(); } @Test public void testGet() { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Book book = (Book) session.get(Book.class, 1); System.out.println("book_name=" + book.getName() + "-----category=" + book.getCategory().getName()); tx.commit(); HibernateUtil.closeSession(); } /** * 查询所有书名 */ @Test public void testQuery() { Session session = HibernateUtil.getSession(); String hql = "select name from Book"; Query query = session.createQuery(hql); List具体的结果自己运行一下就可以了。list = query.list(); for (String bookname : list) { System.out.println(bookname); } } /** * 查询返回多个列 */ @Test public void testQueryMoreElements() { Session session = HibernateUtil.getSession(); String hql = "select name, price from Book"; Query query = session.createQuery(hql); // 查询多个列时,返回结果是数组集合,数组中元素的类型是有查询列来决定的 List