hibernate之條件查詢


一、條件查詢簡介

條件查詢是更據面向對象特色的數據查詢方式,主要通過如下3個類完成

1、Criteria:代表一次查詢

2、Criterion:代表一個查詢條件

3、Restrictions:產生查詢條件的工具類

執行條件查詢的步驟

1、獲取Hibernate session對象

2、調用session的createCriteria()方法創建Criteria查詢對象

3、使用Restrictions的靜態方法創建Criterion查詢條件

4、通過Criteria的add()方法添加查詢條件到Criteria查詢中

5、執行Criteria的list()或uniqueResult()方法返回結果集

二、條件查詢

1、整表查詢

        Criteria c = session.createCriteria(CriteriaTeacher.class);
            List<CriteriaTeacher> list = c.list();
            for (CriteriaTeacher t : list) System.out.println(t.getName());

2、加入查詢條件(通過Criteria的add()方法和Restrictions的靜態方法添加)

        Criteria c = session.createCriteria(CriteriaTeacher.class).add(Restrictions.like("name", "%1%"));
            List<CriteriaTeacher> list = c.list();
            for (CriteriaTeacher t : list) System.out.println(t.getName());

3、關聯查詢(前提持久化類內部有映射關系)

 如果需要使用關聯實體的屬性來增加查詢條件,則需再次使用createCriteria()方法

a、默認鏈接方式

        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .add(Restrictions.like("name", "%1%"))
                    .createCriteria("criteriaTeacher")
            //.createCriteria("criteriaTeacher", "ct")//為關聯實體指定別名 .add(Restrictions.like(
"name", "%1%")); List<CriteriaStudent> list = c.list(); for (CriteriaStudent s : list) System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());

b、指定鏈接方式

        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .add(Restrictions.like("name", "%1%"))
                    .createCriteria("criteriaTeacher", JoinType.LEFT_OUTER_JOIN);//左連接方式
            List<CriteriaStudent> list = c.list();
            for (CriteriaStudent s : list)
                System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());

 c、也可以使用createAlias()方法代替createCriteria()方法

        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .add(Restrictions.like("name", "%1%"))
                    .createAlias("criteriaTeacher", "ct")
                    .add(Restrictions.like("ct.name", "%1%"));
            List<CriteriaStudent> list = c.list();
            for (CriteriaStudent s : list)
                System.out.println("studentName = " + s.getName() + " | teacherName = " + s.getCriteriaTeacher().getName());

4、投影、聚合、分組查詢

hibernate中使用Projection接口代表投影運算,hibernate通過Criteria的setProjection(Projections p)方法進行投影運算,其中Projections作為產生Projection的工廠。

a、投影運算查詢

        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .setProjection(Projections.projectionList()
                    .add(Projections.rowCount()));//統計表中記錄條數
            System.out.println(c.uniqueResult());
        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .setProjection(Projections.projectionList()
                    .add(Projections.count("name"))
                    .add(Projections.groupProperty("name")));//據name值分組統計
            List list = c.list();
            for(Object ob : list) {
                Object[] ob1 = (Object[]) ob;
                System.out.println(ob1[1] + " | " + ob1[0]);
            }
        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .setProjection(Projections.projectionList()
                    .add(Projections.groupProperty("name")));//name去重后列表
            List<String> list = c.list();
            for(String s : list) {
                System.out.println(s);
            }

用alias()方法為指定投影指定別名

        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .setProjection(Projections.projectionList()
                    .add(Projections.alias(Projections.count("name"), "count"))//指定別名
                    .add(Projections.groupProperty("name")))
                    .addOrder(Order.desc("count"));//用別名排序
            List list = c.list();
            for(Object ob : list) {
                Object[] ob1 = (Object[]) ob;
                System.out.println(ob1[1] + " | " + ob1[0]);
            }

 b、選擇查詢(指定要查找的列)

查詢一列

        Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .setProjection(Projections.projectionList()
                    .add(Property.forName("name")));
            List<String> list = c.list();
            for(String s : list) {
                System.out.println(s);
            }

查詢多列

         Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .createAlias("criteriaTeacher", "ct")
                    .setProjection(Projections.projectionList()
                    .add(Property.forName("ct.name"))
                    .add(Property.forName("name")));
            List list = c.list();
            for(Object ob : list) {
                Object[] ob1 = (Object[]) ob;
                System.out.println(ob1[1] + " | " + ob1[0]);
            }

5、離線查詢和子查詢

DetachedCriteria代表離線查詢(允許再session范圍之外創建一個查詢)和子查詢(把DetachedCriteria的查詢結果傳入Criteria中作為查詢條件時,DetachedCriteria就變成了子查詢)

        DetachedCriteria sub = DetachedCriteria
                    .forClass(CriteriaTeacher.class)
                    .setProjection(Projections.projectionList()
                    .add(Property.forName("id")))
                    .add(Restrictions.like("name", "%1%"));

            Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .add(Subqueries.propertyIn("criteriaTeacher", sub));
            List<CriteriaStudent> list = c.list();
            for(CriteriaStudent s : list) {
                System.out.println(s.getName() + " | " + s.getCriteriaTeacher().getName());
            }

 

下面是測試學習時用到的持久化類

@Entity
@Table(name = "criteria_teacher")
public class CriteriaTeacher {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @OneToMany(targetEntity = CriteriaStudent.class, mappedBy = "criteriaTeacher")
    private Set<CriteriaStudent> criteriaStudents = new HashSet<CriteriaStudent>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<CriteriaStudent> getCriteriaStudents() {
        return criteriaStudents;
    }

    public void setCriteriaStudents(Set<CriteriaStudent> criteriaStudents) {
        this.criteriaStudents = criteriaStudents;
    }
}
@Entity
@Table(name = "criteria_student")
public class CriteriaStudent {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToOne(targetEntity = CriteriaTeacher.class)
    @JoinColumn(name = "teacher_id", referencedColumnName = "id", nullable = false)
    private CriteriaTeacher criteriaTeacher;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public CriteriaTeacher getCriteriaTeacher() {
        return criteriaTeacher;
    }

    public void setCriteriaTeacher(CriteriaTeacher criteriaTeacher) {
        this.criteriaTeacher = criteriaTeacher;
    }
}

測試類

public class CriteriaTestController {
    public static void main(String[] args) {
        Configuration cf = new Configuration().configure();
        SessionFactory sf = cf.buildSessionFactory();
        Session session = sf.openSession();
        Transaction ts = session.beginTransaction();
        try {
            Criteria c = session
                    .createCriteria(CriteriaStudent.class)
                    .setProjection(Projections.projectionList()
                    .add(Property.forName("name")));
            List<String> list = c.list();
            for(String s : list) {
                System.out.println(s);
            }
            ts.commit();
        } finally {
            session.close();
            sf.close();
        }
    }
}

 代碼下載:https://github.com/shaoyesun/hibernate_study.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM