一、一些基本的hql語句
1.下面是論壇例子:闆塊(category)、文章(topic)、回複(msg)、臨時資料(msginfo)
import javax.persistence.*;
@Entity
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
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;
}
}
import java.util.Date;
import javax.persistence.*;
@Entity
public class Topic {
private int id;
private String title;
private Category category;
private Date createDate;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@ManyToOne(fetch=FetchType.LAZY)
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
import javax.persistence.*;
@Entity
public class Msg {
private int id;
private String cont;
private Topic topic;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCont() {
return cont;
}
public void setCont(String cont) {
this.cont = cont;
}
@ManyToOne
public Topic getTopic() {
return topic;
}
public void setTopic(Topic topic) {
this.topic = topic;
}
}
public class MsgInfo {
private int id;
private String cont;
private String topicName;
private String categoryName;
public MsgInfo(int id,String cont,String topicName,String categoryName){
super();
this.id=id;
this.cont=cont;
this.topicName=topicName;
this.categoryName=categoryName;
}
public String getTopicName() {
return topicName;
}
public void setTopicName(String topicName) {
this.topicName = topicName;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCont() {
return cont;
}
public void setCont(String cont) {
this.cont = cont;
}
}
import java.util.Date;
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class Modeltest {
private static SessionFactory sf=null;
@BeforeClass
public static void beforeClass(){
sf=new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void testSave(){
Session session=sf.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.setTitle("t"+i);
t.setCreateDate(new Date());
session.save(t);
}
for(int i=0;i<10;i++){
Topic t=new Topic();
t.setId(1);
Msg m=new Msg();
m.setTopic(t);
m.setCont("m"+i);
session.save(m);
}
session.getTransaction().commit();
}
@Test
public void testHQL_1(){
Session session=sf.getCurrentSession();
session.beginTransaction();
//Query q=session.createQuery("from Category");
//Query q=session.createQuery("from Category c where c.name >'c5'");
// Query q=session.createQuery("from Category c order by c.name desc");
Query q=session.createQuery("select distinct c from Category c order by c.name desc");
//按對象查詢,是根據對象ID查詢的,distinct寫不寫都一樣
List<Category> categories=(List<Category>)q.list();
for(Category c:categories){
System.out.println(c.getName());
}
session.getTransaction().commit();
}
@Test
public void testHQL_2(){
Session session=sf.getCurrentSession();
session.beginTransaction();
//Query q=session.createQuery("from Category c where c.id>:min and c.id<:max");
// q.setParameter("min", 2);
// q.setParameter("max", 8);
// q.setInteger("min", 2);
// q.setInteger("max", 8);
Query q=session.createQuery("from Category c where c.id>:min and c.id<:max").setInteger("min", 2).setInteger("max", 8);
List<Category> categories=(List<Category>)q.list();
for(Category c:categories){
System.out.println(c.getName());
}
session.getTransaction().commit();
}
@Test
public void testHQL_3(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("from Category c order by c.name desc");
q.setFirstResult(0);//從第幾條記錄開始
q.setMaxResults(4);//每頁顯示多少個
List<Category> categories=(List<Category>)q.list();
for(Category c:categories){
System.out.println(c.getName());
}
session.getTransaction().commit();
}
@Test
public void testHQL_4(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("select c.id,c.name from Category c ");
List<Object[]> categories=(List<Object[]>)q.list();
for(Object[] o:categories){
System.out.println(o[0]+":"+o[1]);
}
session.getTransaction().commit();
}
//目前是lazy 會在用到category的時候再發SQL語句取category 如果是eager則直接全部取出
@Test
public void testHQL_5(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery(" from Topic t where t.category.id=1 ");
List<Topic> topices=(List<Topic>)q.list();
for(Topic t:topices){
System.out.println(t.getTitle());
System.out.println(t.getCategory().getName());
}
session.getTransaction().commit();
}
@Test
public void testHQL_6(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery(" from Msg m where m.topic.category.id=1 ");
for(Object o:q.list()){
Msg m=(Msg)o;
System.out.println(m.getCont());
}
session.getTransaction().commit();
}
@Test
public void testHQL_7(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("select new com.wzy.model.MsgInfo(m.id,m.cont,m.topic.title,m.topic.category.name) from Msg m");
for(Object o:q.list()){
MsgInfo m=(MsgInfo)o;
System.out.println(m.getCont());
}
session.getTransaction().commit();
}
@Test
public void testHQL_8(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("select t.title,c.name from Topic t join t.category c");
for(Object o:q.list()){
Object[] m=(Object[])o;
System.out.println(m[0]+":"+m[1]);
}
session.getTransaction().commit();
}
@Test
public void testHQL_9(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("from Msg m where m= :MsgToSearch");
Msg m= new Msg();
m.setId(1);
q.setParameter("MsgToSearch", m);
Msg mResult=(Msg)q.uniqueResult();
System.out.println(mResult.getCont());
session.getTransaction().commit();
}
@Test
public void testHQL_10(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("select count(*) from Msg m");
long count=(Long)q.uniqueResult();
System.out.println(count);
session.getTransaction().commit();
}
@Test
public void testHQL_11(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("select max(m.id),min(m.id),avg(m.id),sum(m.id) from Msg m");
Object[] o=(Object[])q.uniqueResult();
System.out.println(o[0]+":"+o[1]+":"+o[2]+":"+o[3]);
session.getTransaction().commit();
}
@Test
public void testHQL_12(){
Session session=sf.getCurrentSession();
session.beginTransaction();
// Query q=session.createQuery("from Msg m where m.id between 3 and 5");
// Query q=session.createQuery("from Msg m where m.id in (3,4,7)");
Query q=session.createQuery("from Msg m where m.cont is not null");
for(Object o : q.list()){
Msg m=(Msg)o;
System.out.println(m.getCont()+":"+m.getId());
}
session.getTransaction().commit();
}
@Test
public void testSchemaExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
二、一些帶聚合函數、子查詢的hql語句
import javax.persistence.*;
@Entity
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
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;
}
}
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
@Entity
public class Topic {
private int id;
private String title;
private Category category;
private Date createDate;
private List<Msg> msg=new ArrayList<Msg>();
@OneToMany(mappedBy="topic")
public List<Msg> getMsg() {
return msg;
}
public void setMsg(List<Msg> msg) {
this.msg = msg;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@ManyToOne(fetch=FetchType.LAZY)
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
import javax.persistence.*;
@Entity
public class Msg {
private int id;
private String cont;
private Topic topic;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCont() {
return cont;
}
public void setCont(String cont) {
this.cont = cont;
}
@ManyToOne
public Topic getTopic() {
return topic;
}
public void setTopic(Topic topic) {
this.topic = topic;
}
}
import java.util.Date;
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class Modeltest {
private static SessionFactory sf=null;
@BeforeClass
public static void beforeClass(){
sf=new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void testSave(){
Session session=sf.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.setTitle("t"+i);
t.setCreateDate(new Date());
session.save(t);
}
for(int i=0;i<10;i++){
Topic t=new Topic();
t.setId(1);
Msg m=new Msg();
m.setTopic(t);
m.setCont("m"+i);
session.save(m);
}
session.getTransaction().commit();
}
@Test
public void testHQL_13(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("from Topic t where t.msg is empty");
for(Object o : q.list()){
Topic t=(Topic)o;
System.out.println(t.getTitle()+":"+t.getId());
}
session.getTransaction().commit();
}
@Test
public void testHQL_14(){
Session session=sf.getCurrentSession();
session.beginTransaction();
//Query q=session.createQuery("from Topic t where t.title like '%5%'"); //%代表多個字元 ; _代表一個字元
Query q=session.createQuery("from Topic t where t.title like '_5%'");
for(Object o : q.list()){
Topic t=(Topic)o;
System.out.println(t.getTitle()+":"+t.getId());
}
session.getTransaction().commit();
}
@Test
public void testHQL_15(){
Session session=sf.getCurrentSession();
session.beginTransaction();
//小寫,大寫,去空格,字元拼接,長度
Query q=session.createQuery("select lower(t.title),upper(t.title),trim(t.title),concat(t.title,'***'),length(t.title) from Topic t");
for(Object o : q.list()){
Object[] arr=(Object[])o;
System.out.println(arr[0]+":"+arr[1]+":"+arr[2]+":"+arr[3]+":"+arr[4]);
}
session.getTransaction().commit();
}
@Test
public void testHQL_16(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("select abs(t.id),sqrt(t.id),mod(t.id,2),current_date,current_time,current_timestamp from Topic t");
for(Object o : q.list()){
Object[] arr=(Object[])o;
System.out.println(arr[0]+" - "+arr[1]+" - "+arr[2]+" - "+arr[3]+" - "+arr[4]+" - "+arr[5] );
}
session.getTransaction().commit();
}
@Test
public void testHQL_17(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("from Topic t where t.createDate<:date");
q.setParameter("date", new Date());
for(Object o : q.list()){
Topic t=(Topic)o;
System.out.println(t.getCreateDate());
}
session.getTransaction().commit();
}
@Test
public void testHQL_18(){
Session session=sf.getCurrentSession();
session.beginTransaction();
// Query q=session.createQuery("select t.title,count(*) from Topic t group by t.title ");
Query q=session.createQuery("select t.title,count(*) from Topic t group by t.title having count(*) >=1 ");
for(Object o : q.list()){
Object[] arr=(Object[])o;
System.out.println(arr[0]+" - "+arr[1]);
}
session.getTransaction().commit();
}
@Test
public void testHQL_19(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("from Topic t where t.id<(select avg(t.id) from Topic t)");
for(Object o : q.list()){
Topic t=(Topic)o;
System.out.println(t.getCreateDate());
}
session.getTransaction().commit();
}
@Test
public void testHQL_20(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("from Topic t where t.id< ALL (select t.id from Topic t where mod(t.id,2)=0)");
for(Object o : q.list()){
Topic t=(Topic)o;
System.out.println(t.getCreateDate());
}
session.getTransaction().commit();
}
@Test
public void testHQL_21(){
Session session=sf.getCurrentSession();
session.beginTransaction();
// exists和in 差不多 但是exists效率高
Query q=session.createQuery("from Topic t where not exists(select m.id from Msg m where m.topic.id=t.id)");
for(Object o : q.list()){
Topic t=(Topic)o;
System.out.println(t.getCreateDate()+"--"+t.getTitle());
}
session.getTransaction().commit();
}
@Test
public void testHQL_22(){
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.createQuery("update Topic t set t.title = upper(t.title)");
q.executeUpdate();
q=session.createQuery("from Topic");
for(Object o : q.list()){
Topic t=(Topic)o;
System.out.println(t.getCreateDate()+"--"+t.getTitle());
}
session.createQuery("update Topic t set t.title=lower(t.title)").executeUpdate();
session.getTransaction().commit();
}
@Test
public void testSchemaExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
三、有命名的hql查詢、使用SQL查詢
import javax.persistence.*;
@Entity
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
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;
}
}
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
@Entity
@NamedQueries({
@NamedQuery(name="topic.selectCertainTopic",query="from Topic t where t.id=:id")
})
public class Topic {
private int id;
private String title;
private Category category;
private Date createDate;
private List<Msg> msg=new ArrayList<Msg>();
@OneToMany(mappedBy="topic")
public List<Msg> getMsg() {
return msg;
}
public void setMsg(List<Msg> msg) {
this.msg = msg;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@ManyToOne(fetch=FetchType.LAZY)
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
import javax.persistence.*;
@Entity
public class Msg {
private int id;
private String cont;
private Topic topic;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCont() {
return cont;
}
public void setCont(String cont) {
this.cont = cont;
}
@ManyToOne
public Topic getTopic() {
return topic;
}
public void setTopic(Topic topic) {
this.topic = topic;
}
}
import java.util.Date;
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class Modeltest {
private static SessionFactory sf=null;
@BeforeClass
public static void beforeClass(){
sf=new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void testSave(){
Session session=sf.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.setTitle("t"+i);
t.setCreateDate(new Date());
session.save(t);
}
for(int i=0;i<10;i++){
Topic t=new Topic();
t.setId(1);
Msg m=new Msg();
m.setTopic(t);
m.setCont("m"+i);
session.save(m);
}
session.getTransaction().commit();
}
<span style="white-space:pre"> </span>//有命名的hql查詢
@Test
public void testHQL_23(){
//不重要 還不如寫配置檔案裡
Session session=sf.getCurrentSession();
session.beginTransaction();
Query q=session.getNamedQuery("topic.selectCertainTopic");
q.setParameter("id", 3);
Topic t=(Topic)q.uniqueResult();
System.out.println(t.getTitle());
session.getTransaction().commit();
}
@Test
public void testHQL_24(){
Session session=sf.getCurrentSession();
session.beginTransaction();
SQLQuery q=session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class);//SQL查詢
List<Category> category=(List<Category>)q.list();
for(Category c: category){
System.out.println(c.getName());
}
session.getTransaction().commit();
}
@Test
public void testSchemaExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
四、QBC和QBE
import javax.persistence.*;
@Entity
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
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;
}
}
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
@Entity
@NamedQueries({
@NamedQuery(name="topic.selectCertainTopic",query="from Topic t where t.id=:id")
})
public class Topic {
private int id;
private String title;
private Category category;
private Date createDate;
private List<Msg> msg=new ArrayList<Msg>();
@OneToMany(mappedBy="topic")
public List<Msg> getMsg() {
return msg;
}
public void setMsg(List<Msg> msg) {
this.msg = msg;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@ManyToOne(fetch=FetchType.LAZY)
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
import javax.persistence.*;
@Entity
public class Msg {
private int id;
private String cont;
private Topic topic;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCont() {
return cont;
}
public void setCont(String cont) {
this.cont = cont;
}
@ManyToOne
public Topic getTopic() {
return topic;
}
public void setTopic(Topic topic) {
this.topic = topic;
}
}
import java.util.Date;
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Restrictions;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class Modeltest {
private static SessionFactory sf=null;
@BeforeClass
public static void beforeClass(){
sf=new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void testSave(){
Session session=sf.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.setTitle("t"+i);
t.setCreateDate(new Date());
session.save(t);
}
for(int i=0;i<10;i++){
Topic t=new Topic();
t.setId(1);
Msg m=new Msg();
m.setTopic(t);
m.setCont("m"+i);
session.save(m);
}
session.getTransaction().commit();
}
@Test
public void testHQL_QBC_1(){
Session session=sf.getCurrentSession();
session.beginTransaction();
//QBC: Query By Criteria
//gt:> lt:< like:模糊查詢 createCriteria:取出關聯表 between("id",2,5):category中id在2和5之間的
Criteria c=session.createCriteria(Topic.class)
.add(Restrictions.gt("id", 2))
.add(Restrictions.lt("id", 8))
.add(Restrictions.like("title", "t_"))
.createCriteria("category")
.add(Restrictions.between("id", 2, 5));
for(Object o : c.list()){
Topic t=(Topic)o;
System.out.println(t.getTitle()+":"+t.getId());
}
session.getTransaction().commit();
}
@Test
public void testHQL_QBE_1(){
Session session=sf.getCurrentSession();
session.beginTransaction();
//QBE: Query By Example 先做個例子(exampleOft) 然後找和這個例子差不多的記錄(e)
Topic exampleOft=new Topic();
exampleOft.setTitle("T_");
Example e=Example.create(exampleOft).ignoreCase().enableLike();
Criteria c=session.createCriteria(Topic.class)
.add(Restrictions.gt("id", 2))
.add(Restrictions.lt("id", 8))
.add(e);
for(Object o : c.list()){
Topic t=(Topic)o;
System.out.println(t.getTitle()+":"+t.getId());
}
session.getTransaction().commit();
}
@Test
public void testSchemaExport(){
new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
以上基本隻有一、二和三的SQL比較常用。