hibernate注解開發,三種查詢語句


Hibernate注解開發

  首先舉個例子(PO類注解配置)

@Entity
@Table(name="t_book")
public class Book {
    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    @Column(name="b_name")
    private String name;
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;
    @Transient
    private Double price;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book [id=" + id + ", name=" + name + ", date=" + date + ", price=" + price + "]";
    }
}

@Entity 聲明一個實體
@Table來描述類與表對應
@Id來聲明一個主鍵
@GenerateValue 用它來聲明一個主鍵生成策略

  默認情況下相當於native,可以選擇的主鍵生成策略 AUTO IDENTITY SEQUENCE

@Column來定義列

@Temporal來聲明日期類型

  TemporalType.DATA   只有年月日,TemporalType.TIME   只有小時分鍾秒,TemporalType.TIMESTAMP 有年月日小時分鍾秒

最后我們在hibernate.cfg.xml文件中將我們的類中的注解引用生效

<mapping class="com.learn.domain.Book"/>

 

  一對多關系注解配置(描述一個客戶擁有多個訂單)

一個客戶類:

@Entity
@Table(name="t_customer")
public class Customer {
    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    /*
     * Id代表主鍵聲明
     * GenericGenerator聲明一個主鍵生成策略
     * GeneratedValue引用一個主鍵生成策略
     * */
    private String id;
    @Column(name="c_name")
    private String name;
    @OneToMany(targetEntity=Order.class,mappedBy="c")
    @Cascade(CascadeType.SAVE_UPDATE)
    //mappedBy代表外鍵交給多的一方來維護
    private Set<Order> orders = new HashSet<>();
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<Order> getOrders() {
        return orders;
    }
    public void setOrders(Set<Order> orders) {
        this.orders = orders;
    }
    @Override
    public String toString() {
        return "Customer [id=" + id + ", name=" + name + "]";
    }
    
}

一個訂單類:

@Entity
@Table(name="t_order")
public class Order {
    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    @Column(name="o_name")
    private String name;
    @ManyToOne(targetEntity=Customer.class)
    @JoinColumn(name="c_customer_id")    //指定外鍵列
    private Customer c = new Customer();
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Customer getC() {
        return c;
    }
    public void setC(Customer c) {
        this.c = c;
    }
    @Override
    public String toString() {
        return "Order [id=" + id + ", name=" + name + ", c=" + c + "]";
    }
}

需要注意的是mappedBy它代表的是外鍵由哪一方來維護,如果是例子中的有引用c的Order類來維護,在保存訂單時,就需要
聲明關系,簡單來說就是要添加訂單與客戶關系的代碼

對於cascade注解,這里在customer中配置了@Cascade(CascadeType.SAVE_UPDATE),這就表示保存客戶自動保存訂單

 

  多對多關系(一個老師可以有多個學生,一個學生也可以有多個老師)

學生類:

@Entity
@Table(name="t_student")
public class Student {
    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    @Column(name="s_name")
    private String name;
    @ManyToMany(targetEntity=Teacher.class,mappedBy="students")
    private Set<Teacher> teachers = new HashSet<>();
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<Teacher> getTeachers() {
        return teachers;
    }
    public void setTeachers(Set<Teacher> teachers) {
        this.teachers = teachers;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }
}

老師類:

@Entity
@Table(name="t_teacher")
public class Teacher {
    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    @Column(name="t_name")
    private String name;
    @ManyToMany(targetEntity=Student.class)
    @JoinTable(name="s_t",joinColumns={@JoinColumn(name="t_teacher_id")},inverseJoinColumns={@JoinColumn(name="s_student_id")})
    @Cascade(CascadeType.SAVE_UPDATE)
    /**
     * ManyToMany代表關聯對象的class(簡單點說就是set中的泛型)
     * JoinTable描述中間表
     * joinColumns就是描述本類中的表與中間表的關系
     * inverseJoinColumns用來描述另一個表與中間表的關系
     * */
    private Set<Student> students = new HashSet<>();
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }
    @Override
    public String toString() {
        return "Teacher [id=" + id + ", name=" + name + ", students=" + students + "]";
    }
}

  一對一關系(用戶和身份編號)

用戶類:

@Entity
@Table(name="t_user")
public class User {
    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    @Column(name="u_name")
    private String name;
    @OneToOne(targetEntity=IDCard.class,mappedBy="user")
    private IDCard idCard;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public IDCard getIdCard() {
        return idCard;
    }
    public void setIdCard(IDCard idCard) {
        this.idCard = idCard;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
}

身份類:

@Entity
@Table(name="t_idcard")
public class IDCard {
    @Id
    @GenericGenerator(name="myuuid",strategy="uuid")
    @GeneratedValue(generator="myuuid")
    private String id;
    @Column(name="i_cardnum")
    private String cardNum;
    @OneToOne(targetEntity=User.class)
    @JoinColumn(name="c_user_id")    //joinColumn指定外鍵列名稱
    @Cascade(CascadeType.SAVE_UPDATE)
    private User user;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getCardNum() {
        return cardNum;
    }
    public void setCardNum(String cardNum) {
        this.cardNum = cardNum;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "IDCard [id=" + id + ", cardNum=" + cardNum + ", user=" + user + "]";
    }
}

 

HQL

public class TestHQL {
    //准備數據
    @Test
    public void test1() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Customer c = new Customer();
        c.setName("猥瑣逼");
        
        for (int i = 0; i < 10; i++) {
            Order order = new Order();
            order.setMoney(2000+i*10d);
            order.setReceiverInfo("日本");
            order.setC(c);
            session.save(order);
        }
        
        
        session.getTransaction().commit();
        session.close();
    }
    //基本索引
    @Test
    public void test2() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Query query = session.createQuery("from Customer");
        List<Customer> list = query.list();
        System.out.println(list);
        session.getTransaction().commit();
        session.close();
    }
    
    //排序索引
    @Test
    public void test3() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Query query = session.createQuery("from Order order by money desc");
        List<Order> list = query.list();
        System.out.println(list);
        
        
        session.getTransaction().commit();
        session.close();
    }
    
    //條件檢索
    @Test
    public void test4() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Query query = session.createQuery("from Order where money > ?");
        query.setParameter(0, 2000d);
        
        List<Order> list = query.list();
        System.out.println(list);
        
        
        session.getTransaction().commit();
        session.close();
    }
    //分頁檢索
    @Test
    public void test5() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Query query = session.createQuery("from Order");
        query.setFirstResult(11);
        query.setMaxResults(6);
        
        List<Order> list = query.list();
        System.out.println(list);
        
        session.getTransaction().commit();
        session.close();
    }
    //分頁統計檢索
    @Test
    public void test6() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        /*Query query = session.createQuery("select count(*) from Order");
        
        Object count = query.uniqueResult();
        System.out.println(count);*/
        
        Query query = session.createQuery("select sum(money) from Order group by c");
        //需要注意的是group by c,其中的c是引用的Customer對象
        List list = query.list();
        
        System.out.println(list);
        session.getTransaction().commit();
        session.close();
    }
    //投影檢索
    //@Test
    public void test7() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Query query = session.createQuery("select new Customer(id,name) from Customer");
        List<Customer> list = query.list();
        System.out.println(list);
        
        session.getTransaction().commit();
        session.close();
    }
}

 

QBC

public class TestQBC {
    //基本檢索
    @Test
    public void test1() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Criteria criteria = session.createCriteria(Customer.class);
        List<Customer> list = criteria.list();
        System.out.println(list);
        
        session.getTransaction().commit();
        session.close();
    }
    //排序查詢
    @Test
    public void test2() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Criteria criteria = session.createCriteria(Order.class);
        criteria.addOrder(org.hibernate.criterion.Order.asc("money"));
        List list = criteria.list();
        System.out.println(list);
        
        session.getTransaction().commit();
        session.close();
    }
    //條件檢索
    @Test
    public void test3() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Criteria criteria = session.createCriteria(Customer.class);
        criteria.add(Restrictions.eq("name", "猥瑣逼"));
        Object result = criteria.uniqueResult();
        System.out.println(result);
        
        session.getTransaction().commit();
        session.close();
    }
    //分頁查詢
    @Test
    public void test4() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Criteria criteria = session.createCriteria(Order.class);
        criteria.setFirstResult(0);
        criteria.setMaxResults(2);
        List<Order> list = criteria.list();
        System.out.println(list);
        
        session.getTransaction().commit();
        session.close();
    }
    //統計分頁查詢
    @Test
    public void test5() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        Criteria criteria = session.createCriteria(Order.class);
        /*criteria.setProjection(Projections.rowCount());
        Object count = criteria.uniqueResult();
        System.out.println(count);*/
        
        criteria.setProjection(Projections.projectionList().add(Projections.sum("money")).add(Projections.groupProperty("c")));
        
        List<Object[]> list = criteria.list();
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
        }
        session.getTransaction().commit();
        session.close();
    }
    //離線條件查詢
    @Test
    public void test6() {
        //創建離線查詢對象
        DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
        dc.add(Restrictions.eq("name", "猥瑣逼"));
        
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //生成criteria
        Criteria criteria = dc.getExecutableCriteria(session);
        
        Customer c = (Customer) criteria.uniqueResult();
        System.out.println(c);
        
        
        session.getTransaction().commit();
        session.close();
    }
}

 

SQL

public class TestSQL {
    //測試執行sql
    @Test
    public void test1() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        
        SQLQuery query = session.createSQLQuery("select * from t_customer");
        //將查詢結果綁定到指定對象
        query.addEntity(Customer.class);
        List list = query.list();
        
        System.out.println(list);
        
        
        session.getTransaction().commit();
        session.close();
    }
}

 


免責聲明!

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



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