Tôi đang ở vị trí mà công ty chúng tôi có dịch vụ tìm kiếm cơ sở dữ liệu có khả năng cấu hình cao, rất hữu ích để định cấu hình truy vấn theo cách lập trình. Criteria API là mạnh mẽ nhưng khi một trong những nhà phát triển của chúng tôi tái cấu trúc một trong các đối tượng dữ liệu, các hạn chế tiêu chí sẽ không báo hiệu rằng chúng bị hỏng cho đến khi chúng tôi chạy thử nghiệm đơn vị hoặc tệ hơn, trực tiếp và môi trường sản xuất của chúng tôi. Gần đây, chúng tôi đã có một dự án tái cấu trúc về cơ bản gấp đôi thời gian làm việc bất ngờ do vấn đề này, một khoảng trống trong kế hoạch dự án, chúng tôi đã biết nó sẽ mất bao lâu, có lẽ chúng tôi đã có cách tiếp cận khác.Làm cách nào để vượt qua các giới hạn của các tiêu chí và API mẫu của Hibernate?
Tôi muốn sử dụng API mẫu để giải quyết vấn đề này. Trình biên dịch Java có thể lớn tiếng chỉ ra rằng các truy vấn của chúng ta được borked nếu chúng ta đang chỉ định điều kiện 'where' trên các thuộc tính POJO thực. Tuy nhiên, chỉ có rất nhiều chức năng trong API mẫu và nó hạn chế theo nhiều cách. Lấy ví dụ sau
Product product = new Product();
product.setName("P%");
Example prdExample = Example.create(product);
prdExample.excludeProperty("price");
prdExample.enableLike();
prdExample.ignoreCase();
Ở đây, bất động sản "tên" đang được truy vấn chống lại (nơi tên như 'P%'), và nếu tôi là để loại bỏ hoặc đổi tên trường "Tên", chúng ta sẽ biết ngay lập tức . Nhưng những gì về tài sản "giá"? Nó bị loại trừ bởi vì đối tượng Product có một số giá trị mặc định cho nó, vì vậy chúng tôi chuyển tên thuộc tính "price" tới một bộ lọc loại trừ. Bây giờ nếu "giá" đã bị xóa, truy vấn này sẽ không hợp lệ về cú pháp và bạn sẽ không biết cho đến khi chạy. QUÈ.
Một vấn đề khác - những gì nếu chúng ta thêm một giây mệnh đề where:
product.setPromo("Discounts up to 10%");
Bởi vì cuộc gọi đến enableLike(), ví dụ này sẽ phù hợp trên văn bản quảng cáo "Giảm giá lên đến 10%", mà còn "Giảm giá tới 10.000.000 đô la" hoặc bất kỳ điều gì khác phù hợp. Nói chung, các sửa đổi toàn bộ truy vấn của đối tượng Ví dụ, chẳng hạn như enableLike() hoặc ignoreCase() không phải lúc nào cũng được áp dụng cho mọi thuộc tính đang được kiểm tra.
Đây là vấn đề thứ ba và quan trọng - về các tiêu chí đặc biệt khác? Không có cách nào để có được mọi sản phẩm với mức giá lớn hơn $ 10 bằng cách sử dụng khung mẫu tiêu chuẩn. Không có cách nào để sắp xếp kết quả theo quảng cáo, giảm dần. Nếu đối tượng Product tham gia trên một số Nhà sản xuất, thì không có cách nào để thêm tiêu chí vào đối tượng Nhà sản xuất có liên quan. Không có cách nào để chỉ định FetchMode một cách an toàn trên tiêu chí cho Nhà sản xuất (mặc dù đây là vấn đề với API tiêu chí nói chung - các mối quan hệ được tìm nạp không hợp lệ không âm thầm, thậm chí nhiều hơn một quả bom thời gian)
Cho tất cả những điều trên ví dụ, bạn sẽ cần phải quay lại API tiêu chí và sử dụng các biểu diễn chuỗi các thuộc tính để tạo truy vấn - một lần nữa, loại bỏ lợi ích lớn nhất của các truy vấn mẫu.
Những lựa chọn thay thế nào tồn tại đối với API mẫu có thể nhận được loại lời khuyên biên dịch thời gian mà chúng tôi cần?
Đây là nội dung thú vị nhưng stackoverflow không phải là diễn đàn thảo luận, bạn sẽ không nhận được phản hồi ở đây và câu hỏi của bạn có thể sẽ bị đóng trong biểu mẫu hiện tại. Như đã đề cập trong phần Câu hỏi thường gặp, * "nó cũng hoàn toàn tốt để hỏi và trả lời câu hỏi của riêng bạn, miễn là bạn giả vờ bạn đang ở trên Jeopardy: cụm từ nó dưới dạng một câu hỏi" *. Tôi đề nghị rephrase nó và đăng các chi tiết như câu trả lời. –
@Pascal cảm ơn, tôi sẽ tiếp tục và định dạng lại câu hỏi –
Bạn được chào đón. Và cảm ơn vì đã đăng bài này. –