2012-06-07 48 views
13

Khi tạo truy vấn được đặt tên trong JPA, có một phương pháp hay nhất được chấp nhận cho tên của các truy vấn này (ví dụ: EntityName.allActive hoặc findAllActiveFoos v.v.) và cũng là tốt để khai báo các truy vấn được đặt tên này trong các lớp thực thể họ truy vấn hoặc tất cả cùng nhau trong một lớp tiện ích?NamedQuery: Thực hành tốt nhất

+1

Câu trả lời liên quan: http://stackoverflow.com/a/4948333/1725096 –

Trả lời

10

Không, không có thực hành tốt nhất được chấp nhận rộng rãi bao gồm mọi trường hợp phức tạp. Nói chung, không có quá nhiều hướng dẫn về phong cách cho JPA. Những gì dường như thường được chấp nhận, và nói chung được sử dụng trong sách là tốt, là để bắt đầu truy vấn với tên của thực thể.

Tôi sẽ đi cho EntityName (để đảm bảo tên duy nhất trong đơn vị kiên trì) kết hợp với hoạt động và đối số.

  • Person.findByAge
  • Person.findByAgeAndFirstName
  • Person.removeByFirstName
  • Person.updateSalaryIfYearBornBefore

Cũng giống như một ghi chú, đặc điểm kỹ thuật sử dụng with thay vì by trong các ví dụ, và không truy vấn tiền tố có tên của thực thể. Nhưng đó là đặc điểm của khóa học, không phải là hướng dẫn về phong cách.

Tôi thấy tốt khi khai báo hằng số cho các tên truy vấn này và sau đó sử dụng các hằng số này trong cả hai @ NamedQuery.name và em.createNamedQuery.

Vì @NamedQuery, @NamedNativeQuery và @NamedQueries chỉ có thể được áp dụng cho siêu lớp được ánh xạ hoặc thực thể, bạn không thể định vị chúng vào lớp tiện ích.

+2

Tôi tin rằng 'Entity.camelCaseWhatItDoesName' khá đủ điều kiện là phương pháp hay nhất. Trong các dự án trước đây, một số khách hàng đã áp dụng phong cách này. – Kawu

4

Mặc dù dường như không phải là thực tiễn tốt nhất được chấp nhận trên toàn cầu, sách "Pro JPA 2" của Mike Keith và Merrick Shincariol đề xuất chính xác những gì Mikko đã nói, ví dụ: nếu bạn có một truy vấn để tìm tất cả các nhân viên thì hãy gọi nó là "Employee.findAll".

Ito nơi để khai báo này, một lần nữa không có thực hành tốt nhất thực sự từ những gì tôi có thể nhìn thấy. Chúng dường như có xu hướng ưu tiên khai báo chúng trên thực thể hơn là tất cả trong một lớp lớn (như một lớp cơ sở MappedSuperclass mà từ đó tất cả các thực thể của bạn mở rộng) vì nó sẽ nhanh chóng trở thành nguyên khối và có thể hơi khó duy trì. Một tùy chọn khác là khai báo chúng trong một tệp XML riêng biệt, không phải là tôi sẽ đề xuất điều đó. Cá nhân tôi thích cách tiếp cận mà họ được tuyên bố trên thực thể mà họ có liên quan đến. Tôi cũng đồng ý với đề xuất của Miko để sử dụng hằng số cho tên, bạn chỉ có thể xác định tất cả các hằng số này trong một lớp riêng biệt.

+0

như là một sang một bên, một thực hành tốt nhất là rất khuyến khích cho các truy vấn được đặt tên là sử dụng các tham số được đặt tên như trái ngược với các tham số vị trí. Điều này làm cho các truy vấn dễ dàng hơn nhiều để làm việc với. – brent777

Các vấn đề liên quan