So sánh sessionfactory và session trong hibernate năm 2024

Trước đây các bạn đã làm quen với Hibernate, nay mình sẽ giới thiệu các bạn về HQL hay còn gọi là Hibernate Query Language . Trên thực tế, đây là SQL được chuyển đổi để viết các truy vấn trong Hibernate. Nó có một số điểm khác biệt chính.

  1. Sử dụng tên lớp thay vì tên bảng.
  2. Sử dụng tên trường lớp thay vì tên cột của bảng.
  3. Tùy chọn sử dụng select.

Hãy yêu cầu Hibernate trả lại cho chúng ta tất cả người dùng mà nó có trong cơ sở dữ liệu. Đây là yêu cầu đó sẽ như thế nào:

Đó là tất cả, để so sánh, chúng tôi trình bày một truy vấn tương tự trong SQL:

Đây `User`là tên của lớp, và `user`là tên của bảng.

Mã Java hoàn chỉnh sẽ trông như thế này:


public List getAllUsers() {
    try (Session session = sessionFactory.openSession()) {
            return session.createQuery("from User", User.class).list();
    }
}

Mặt khác, HQL rất giống với SQL - nó cũng có các toán tử:

  • WHERE
  • ORDER BY
  • GROUP BY
  • @Entity @Table(name="user_data") class User { @Id @GeneratedValue public Integer id; @Column(name="user_name") public String name; @Column(name="user_level") public Integer level; @Column(name="user_created") public Date created; }

    0

1.2 Ví dụ làm việc với HQL

Có lẽ ví dụ trước hơi khó hiểu do tên bảng và trường giống nhau. Hãy đưa ra một ví dụ đặc biệt mà điều này sẽ dễ dàng hơn.

Giả sử chúng ta có bảng user_data chứa các trường sau:

  • id INT
  • tên người dùng VARCHAR(100)
  • user_level INT
  • user_created NGÀY

Chúng tôi sẽ tạo một lớp Java sẽ ánh xạ tới bảng này:


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
   @Column(name="user_name")
   public String name;
   @Column(name="user_level")
   public Integer level;
   @Column(name="user_created")
   public Date created;
}

Bây giờ hãy viết một số ví dụ:

HQL SQL từ người dùng chọn * từ user_data từ Người dùng trong đó id=3 chọn * từ user_data trong đó id=3 từ Người dùng có cấp độ trong (10,20,30) chọn * từ user_data nơi user_level IN (10, 20, 30) từ đơn đặt hàng của người dùng bằng cách tạo asc chọn * từ thứ tự user_data theo user_created asc từ Người dùng có tên như 'kiểm tra' chọn * từ user_data nơi user_name như 'kiểm tra'

Các truy vấn rất giống nhau và việc đọc các truy vấn HQL khi bạn đã quen với tên lớp và các trường của chúng cũng dễ như đọc các truy vấn SQL. Nó có thể khó viết hơn một chút, nhưng một lần nữa, các truy vấn rất phức tạp hiếm khi được viết bằng HQL.

1.3 Sử dụng chọn

Trong HQL, bạn có thể sử dụng


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
   @Column(name="user_name")
   public String name;
   @Column(name="user_level")
   public Integer level;
   @Column(name="user_created")
   public Date created;
}

1khi kiểu dữ liệu của kết quả không khớp với kiểu được chỉ định trong


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
   @Column(name="user_name")
   public String name;
   @Column(name="user_level")
   public Integer level;
   @Column(name="user_created")
   public Date created;
}

2.

Ví dụ: chúng tôi muốn lấy tên của tất cả người dùng trong bảng user_data của chúng tôi , thì chúng tôi cần viết truy vấn sau:

Ngoài ra, nếu có sự trùng lặp giữa các tên, thì bạn có thể sử dụng toán tử


@Entity
@Table(name="user_data")
class User {
   @Id
   @GeneratedValue
   public Integer id;
   @Column(name="user_name")
   public String name;
   @Column(name="user_level")
   public Integer level;
   @Column(name="user_created")
   public Date created;
}

3:

select distinct name from User

Bí danh hoạt động giống như trong SQL:

select distinct u.name from User u where u.created > '2020-01-01'

Chà, hoàn toàn ở dạng mã Java, yêu cầu này sẽ giống như thế này:

public List getUserNames() {
    try (Session session = sessionFactory.openSession()) {
            String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
            Query query = session.createQuery(hql , String.class);
            return query.list();
    }
}

Lưu ý rằng truy vấn phải trả về một danh sách tên. Tên thuộc loại Chuỗi, do đó, cả loại hàm và tham số loại của lớp Truy vấn đều thuộc loại Chuỗi.