Tôi thích loại an toàn CriteriaQuery mang lại cho JPA 2.0 nhưng nó cũng mang lại một chút mã tấm nồi hơi. Ví dụ, giả sử tôi có một thực thể tên là NamedEntity, đơn giản chỉ có một id và một trường String được gọi là "name" (giả sử nó có ràng buộc duy nhất được đặt thành true). Dưới đây là những gì các NamedEntityManager có thể trông giống như:Có cách nào để giảm số lượng mã tấm nồi hơi liên kết với một CriteriaQuery (trong JPA 2.0) không?
public class NamedEntityManager
{
//inject using your framework
EntityManager entityManager;
//retrieve all existing entities of type NamedEntity from DB
public Iterable<NamedEntity> queryAll()
{
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<NamedEntity> query = builder.createQuery(NamedEntity.class);
return entityManager.createQuery(query).getResultList();
}
//retrieve a single entity of type NamedEntity from DB using specified name
public NamedEntity queryByName(String name)
{
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<NamedEntity> query = builder.createQuery(NamedEntity.class);
Root<NamedEntity> root = query.from(NamedEntity.class);
query = query.where(root.<NamedEntity>get("name").in(name));
//skipped the try/catch block for the sake of brevity
return entityManager.createQuery(query).getSingleResult();
}
}
Có cách nào để ngưng tụ mã để tránh sao chép/dán các dòng cùng một mã vào mỗi phương pháp truy vấn? Có lẽ bằng cách nào đó tái sử dụng đối tượng CriteriaQuery?
Tình huống này có thể dễ dàng được giải quyết bằng chiến lược. Chỉ cần tạo một phương thức riêng, phương thức này sẽ lấy một tham số (một giao diện) kiểu, WhereClauseBuilder, phương thức riêng sẽ nhận được phần khác nhau của nó (mệnh đề where) từ tham số này thông qua một lời gọi phương thức truyền các tiêu chí và truy vấn tới nó. Tất cả các phương thức công khai, sẽ chỉ gọi phương thức riêng với một đối tượng cụ thể WhereClauseBuilder trả về vị từ cần thiết trong đó mệnh đề. –