6.1 Truy vấn được đặt tên

Hibernate cho phép bạn không lưu trữ truy vấn trực tiếp trong mã. Thay vào đó, anh ấy đề xuất đặt tên truy vấn và lưu trữ chúng riêng biệt dưới dạng chú thích. Vâng, sau đó thực hiện yêu cầu mong muốn trực tiếp theo tên của nó. Ví dụ:

@org.hibernate.annotations.NamedQueries({
    @org.hibernate.annotations.NamedQuery(name = "Employee_FindById",
  	query = "from Employee where id = :id"),
    @org.hibernate.annotations.NamedQuery(name = "Employee_FindAllEmployes",
  	query = "from Employee"),
    @org.hibernate.annotations.NamedQuery(name = "Employee_UpdateEmployeeName",
  	query = "Update Employee set name = :newName where id = :id"),
...
})

Có thể thêm chú thích trước bất kỳ lớp Thực thể nào: tên truy vấn không được gắn với bất kỳ Thực thể nào.

Bạn cũng có thể thêm nhiều tham số khác nhau vào truy vấn (query):

@org.hibernate.annotations.NamedQuery(
  name = "Employee_ FindAllEmployes",
  query = "from Employee",
  timeout = 1,
  fetchSize = 10,
  cacheable = true,
  cacheMode = "GET"
)

Sử dụng các yêu cầu như vậy rất đơn giản - đối với điều này, bạn cần sử dụng một phương thức createNamedQuerythay vì một phương thức createQuery:


Query<Employee> query = session.createNamedQuery("Employee_FindAllEmployes", Employee.class);
List<Employee> resultLIst = query.list();

6.2 Truy vấn gốc

Và một thứ đơn giản nhưng rất hữu ích nữa là NativeQuery .

Nếu bạn không muốn sử dụng HQL, nhưng muốn sử dụng Hibernate để ánh xạ thực thể, thì bạn có thể viết các truy vấn bằng SQL cũ tốt. Không ai giới hạn bạn.

Để làm điều này, bạn chỉ cần gọi phương thức createNativeQuery(), thay vì createQuery().


NativeQuery<Employee> query = session.createNativeQuery("select * from employee", Employee.class);
List<Employee> resultLIst = query.list();

Bạn chỉ cần viết createNativeQueryvà mọi thứ sẽ hoạt động như trước. Phương thức này trả về một đối tượng kiểu NativeQuery , hỗ trợ tất cả các phương thức mà lớp Truy vấn hỗ trợ . Không có gì sẽ thay đổi cho bạn.

Ngoài ra, Truy vấn SQL gốc cũng có thể được lưu trữ dưới dạng Truy vấn được đặt tên .


@org.hibernate.annotations.NamedNativeQueries(
    @org.hibernate.annotations.NamedNativeQuery(name = "Employee_GetAll",
  	query = "select * from employee",
  	resultClass = Employee.class)
)

Và tất nhiên, đây là mã để làm việc với chúng:


NativeQuery<Employee> query = session.createNamedQuery("Employee_GetAll", Employee.class);
List<Employee> resultLIst = query.list();