Thứ Bảy, 7 tháng 1, 2017

Using Queries

Đối với hầu hết các ứng dụng doanh nghiệp, nhận được dữ liệu trong cơ sở dữ liệu là ít nhất cũng quan trọng như khả năng để đưa dữ liệu mới. Từ tìm kiếm để phân loại, phân tích, và kinh doanh thông minh, hiệu quả chuyển động dữ liệu từ cơ sở dữ liệu cho các ứng dụng và trình bày nó cho người dùng là một phần thường xuyên của doanh nghiệp phát triển. Làm như vậy đòi hỏi phải có khả năng phát hành các truy vấn số lượng lớn so với cơ sở dữ liệu và giải thích kết quả cho các ứng dụng. Mặc dù ngôn ngữ cấp cao và các khuôn khổ hiện có trong nhiều trường hợp đã cố gắng để ngăn cách các nhà phát triển từ các tác vụ xử lý các truy vấn cơ sở dữ liệu ở cấp độ SQL, nó có thể là công bằng để nói rằng hầu hết các nhà phát triển doanh nghiệp đã làm việc với ít nhất một phương ngữ SQL tại một số điểm trong sự nghiệp của họ.

 Object-relational mapping bổ sung một mức độ phức tạp nhiệm vụ này. Hầu hết thời gian, các phát triển sẽ muốn các kết quả chuyển đổi cho các đối tượng để các kết quả truy vấn có thể được sử dụng trực tiếp ứng dụng logic. Tương tự như vậy, nếu mô hình miền đã được trừu tượng hóa từ mô hình vật lý thông qua đối tượng-quan hệ lập bản đồ, nó làm cho cảm giác cũng truy vấn trừu tượng đi từ SQL, mà không phải là chỉ gắn với các mô hình vật lý nhưng cũng khó để cổng giữa các nhà cung cấp. May mắn thay, như chúng ta sẽ thấy, JPA có thể xử lý một tập hợp đa dạng các yêu cầu truy vấn.

JPA hỗ trợ hai phương pháp để thể hiện các truy vấn để lấy các thực thể và liên tục dữ liệu khác từ cơ sở dữ liệu: ngôn ngữ truy vấn và các API tiêu chí. Ngôn ngữ truy vấn chính là Java.Ngôn ngữ truy vấn Persistence (JP QL), một ngôn ngữ truy vấn cơ sở dữ liệu độc lập mà hoạt động trên mô hình thực thể hợp lý như trái ngược với các mô hình dữ liệu vật lý. Truy vấn cũng có thể được thể hiện trong SQL để tận dụng các cơ sở dữ liệu nằm bên dưới. Các API tiêu chí cung cấp một phương pháp khác để xây dựng các truy vấn dựa trên Java objects thay vì các chuỗi truy vấn.


I.Named Query Definition

truy vấn có tên là một công cụ mạnh mẽ cho việc tổ chức định nghĩa truy vấn và cải thiện ứng dụng hiệu suất. Một truy vấn có tên được xác định bằng cách sử dụng chú thích @NamedQuery, có thể được đặt trên Định nghĩa lớp cho bất kỳ thực thể. Các chú thích định nghĩa tên của các truy vấn, cũng như các văn bản truy vấn.
@NamedQuery(name="findSalaryForNameAndDepartment", query="SELECT e.salary " + "FROM Employee e " + "WHERE e.department.name = :deptName AND " + " e.name = :empName")
Nhiều queries trong 1 class entity
@NamedQueries({ @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e"), @NamedQuery(name="Employee.findByPrimaryKey", query="SELECT e FROM Employee e WHERE e.id = :id"), @NamedQuery(name="Employee.findByName", query="SELECT e FROM Employee e WHERE e.name = :name") })
  • Chạy 1 named Query
@Stateless
public class EmployeeServiceBean implements EmployeeService {
@PersistenceContext(unitName = “EmployeeService”)
EntityManager em;
public Employee findEmployeeByName(String name) {
return em.createNamedQuery("Employee.findByName", Employee.class).setParameter("name", name).getSingleResult();
} // ... 
}

Parameter Types

@NamedQuery(name="findEmployeesAboveSal", query="SELECT e " + "FROM Employee e " + "WHERE e.department = :dept AND " + " e.salary > :sal")
  • Cách gán dữ liệu
@Stateless
public class EmployeeServiceBean implements EmployeeService {
@PersistenceContext(unitName = "EmployeeService")
EntityManager em;
public List findEmployeesAboveSal(Department dept,
long minSal) {
return em.createNamedQuery("findEmployeesAboveSal",
Employee.class)
.setParameter("dept", dept)
.setParameter("sal", minSal)
.getResultList();
}
// ...
}
  • Gán dữ liệu kiểu Date
@Stateless
public class EmployeeServiceBean implements EmployeeService {
@PersistenceContext(unitName = "EmployeeService")
EntityManager em;
public List findEmployeesHiredDuringPeriod(Date start,
Date end) {
return em.createQuery("SELECT e "
+ "FROM Employee e "
+ "WHERE e.startDate BETWEEN ?1 AND ?2",
Employee.class)
.setParameter(1, start, TemporalType.DATE)
.setParameter(2, end, TemporalType.DATE)
.getResultList();
}
// ...
}

II.Đánh giá

JavaBeans Query Language (EJBQL) cho phép phát triển viết các công cụ tìm xách tay và chọn phương pháp cho entity bean container quản lý. Dựa trên một tập hợp con nhỏ của SQL, nó giới thiệu một cách để điều hướng qua các mối quan hệ thực thể cả để chọn dữ liệu và để lọc các kết quả. Thật không may, nó đặt những hạn chế nghiêm ngặt về cấu trúc của các truy vấn, hạn chế kết quả hoặc là một thực thể duy nhất hoặc một lĩnh vực kéo dài từ một thực thể. Bên tham gia giữa các thực thể là có thể, nhưng sử dụng một ký hiệu kỳ lạ. Việc phát hành ban đầu thậm chí còn không hỗ trợ phân loại.

III.Kết

Ta có cái nhìn tổng quan về các tính năng chính JPQL cho các nhà phát triển đã có kinh nghiệm với SQL hoặc EJB QL. Trong các cuộc thảo luận về việc thực hiện các truy vấn, ta giới thiệu các phương pháp để xác định các truy vấn cả
động trong thời gian chạy và tĩnh như một phần của đơn vị bền vững siêu dữ liệu. Chúng ta nhìn vào các truy vấn và TypedQuery giao diện và các loại kết quả truy vấn có thể sử dụng JP QL. Chúng ta cũng xem xét tham số ràng buộc, các chiến lược để xử lý bộ kết quả lớn và làm thế nào để đảm bảo rằng các truy vấn trong các giao dịch với dữ liệu biến đổi hoàn toàn thành công.

Trong phần về cập nhật hàng loạt và xóa chúng nhìn như thế nào để thực hiện các loại truy vấn và làm thế nào để đảm bảo rằng chúng được sử dụng một cách an toàn bởi các ứng dụng. Chúng ta cung cấp chi tiết về cách kiên trì
nhà cung cấp hợp đồng với số lượng lớn các hoạt động và tác động mà họ có trong bối cảnh kiên trì hoạt động.

Chúng ta kết thúc cuộc thảo luận của chúng ta về tính năng truy vấn với một cái nhìn gợi ý truy vấn. Chúng tađã cho thấy làm thế nào để xác định
gợi ý và cung cấp một ví dụ sử dụng gợi ý hỗ trợ bởi việc thực hiện JPA tham khảo.

Cuối cùng, chúng ta tóm tắt quan điểm của chúng ta về thực hành tốt nhất liên quan đến truy vấn, nhìn vào các truy vấn được đặt tên,
chiến lược khác nhau cho các loại truy vấn khác nhau, cũng như các chi tiết thực hiện cần được hiểu cho các nhà cung cấp khác nhau kiên trì.

Không có nhận xét nào:

Đăng nhận xét