2008-09-09 23 views
5

Điều này không dành riêng cho bất kỳ ngôn ngữ nào, đó chỉ là thực hành tốt nhất. Tôi đang sử dụng JPA/Hibernate (nhưng nó có thể là bất kỳ giải pháp ORM nào khác) và tôi muốn biết các bạn xử lý tình huống này như thế nào: Giả sử bạn có một truy vấn trả về một thứ không được đại diện bởi bất kỳ các lớp miền của bạn. Bạn có tạo một lớp cụ thể để đại diện cho truy vấn cụ thể đó không? Bạn có trả lại truy vấn ở một số loại đối tượng khác (mảng, bản đồ ...) Một số giải pháp khác? Tôi muốn biết về trải nghiệm và phương pháp hay nhất của bạn.Việc cần làm với các truy vấn không có đại diện trong mô hình miền?

P.S. Thực ra tôi đang tạo objetcs cụ thể cho các truy vấn cụ thể.

Trả lời

0

Tôi thường viết một hàm thực hiện truy vấn bằng SQL và sau đó đặt kết quả vào danh sách hoặc từ điển (trong Java, tôi sẽ sử dụng ArrayList hoặc HashMap).

Nếu tôi thấy mình làm điều này rất nhiều, tôi có thể tạo một tệp mới để chứa tất cả các truy vấn này. Nếu không, tôi chỉ làm cho chúng hoạt động trong bất kỳ tập tin nào mà chúng cần/sử dụng.

Vì chúng tôi đang nói riêng Java, tôi chắc chắn sẽ không tạo một lớp mới trong một tệp riêng biệt. Tuy nhiên, đối với các truy vấn cần thiết chỉ trong một lớp, bạn có thể tạo một lớp tĩnh bên trong riêng tư chỉ với (các) hàm cần thiết để tạo (các) truy vấn cần thiết cho lớp đó.

0

Ý tưởng bao bọc chức năng trong một số loại trình quản lý luôn tốt đẹp. Nó cho phép thử nghiệm tốt hơn và quản lý do đó thay đổi lược đồ.

Cũng cho phép sử dụng lại dễ dàng hơn trong ứng dụng. KHÔNG BAO GIỜ chỉ cần đặt sql trực tiếp !!!. Đối với Hibernate tôi đã tìm thấy HQL tuyệt vời cho chỉ này. Đặc biệt, nếu bạn có thể sử dụng truy vấn được đặt tên. Ngoài ra hãy cẩn thận khi thêm một giá trị bộ lọc, v.v. sử dụng "string append", sử dụng tham số (chúng ta có thể nói SQL injection không?). Ngay cả khi SQL là động trong điều khoản của tham gia hoặc nơi tiêu chí, có một chức năng trong một số loại quản lý luôn luôn là tốt nhất.

1

Chúng tôi có một tình huống có vẻ tương tự như của bạn.

Chúng tôi sử dụng các đối tượng riêng biệt để báo cáo dữ liệu mở rộng nhiều đối tượng miền. Quy ước của chúng ta là chúng sẽ được hỗ trợ bởi một khung nhìn trong cơ sở dữ liệu, vì vậy chúng ta đã gọi chúng là các đối tượng xem. Chúng tôi thường sử dụng chúng để tóm tắt dữ liệu phức tạp thành một định dạng phẳng.

+0

đó là những gì tôi đang làm bây giờ. Tôi thấy đây là một giải pháp thực tế hơn và tôi thấy có những người khác cũng làm như vậy. Tuyệt vời! –

0

@DrPizza

Tôi sẽ cụ thể hơn. Chúng tôi có ba bảng trong cơ sở dữ liệu

USER 
PROJECT 
TASK 
USER to TASK 1:n 
PROJECT to TASK 1:n 

Tôi có một truy vấn trả về một danh sách tất cả các dự án nhưng cũng hiển thị một số thông tin được nhóm (tất cả công việc, nhiệm vụ mở). Khi quay trở lại, truy vấn trông như thế này

PROJECTID: 1 
NAME: New Web Site 
ALLTASK: 10 
OPENTASK: 7 
CLOSEDTASK: 3 

tôi không có bất kỳ lớp miền mà có thể đại diện cho thông tin này và tôi không muốn tạo ra các phương pháp cụ thể trong lớp học dự án (như getAllTasks, getOpenTasks) bởi vì mỗi người những phương pháp này sẽ kích hoạt một truy vấn mới. Vì vậy, câu hỏi là: Tôi tạo một lớp mới (somenthing như ProjectTasksQuery) chỉ để giữ thông tin đó? Tôi trả lại thông tin trong mảng hoặc bản đồ? Cái gì khác?

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