2012-11-05 15 views
6

Lambdaj (và một số thư viện tương tự khác) cung cấp một chức năng having cho phép tôi để xác định vị như vậy (ví dụ trực tiếp từ trang lambdaj Features):Có thư viện Java nào để định nghĩa các biến vị ngữ như các chuỗi giống SQL không?

List<Person> oldFriends = 
    filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends); 

tôi đã khá thích để có thể xác định Java của tôi ngữ đối tượng sử dụng một cú pháp đơn giản chuỗi, "age > 30" - tương tự như một SQL mệnh đề where - vì vậy bộ lọc trên trở thành một cái gì đó như:

List<Person> oldFriends = 
    filter(having(Person.class, "age > 30"), meAndMyFriends); 

có một thư viện như vậy tồn tại, hoặc bất cứ ai có thể giới thiệu một số khối xây dựng cho phần truy vấn phân tích cú pháp Tôi đồng uld sử dụng để xây dựng một bản thân mình? Tôi không thực sự tâm trí những loại vị ngữ (hamcrest, ổi vv) nó tạo ra. Tôi có thể nghĩ đến một số điều tuyệt vời để hỗ trợ: sự cân bằng và bất bình đẳng, về các loại tùy chỉnh và nguyên thủy, và/hoặc/không, dấu ngoặc đơn, LIKE (đối với Strings) , in(...), diễn giải tên enum, thuộc tính của thuộc tính.

Dưới đây là một ví dụ về một vị phức tạp hơn:

"salesCount > 10 and (country='UK' or city='New York') 
and attitude not in (MENACING, RUDE) 
and product.name <> 'Widget' " 

(Ví dụ này giả định rằng các lớp ngữ được áp dụng cho (nói một lớp SalesPerson) có phương pháp getSalesCount(), getCountry(), và getCity(), cũng như getAttitude() (trả về một enum). Nó cũng có một thuộc tính getProduct trả về một kiểu với phương thức getName).

Động lực: chúng tôi có hệ thống máy khách-khách hàng có nhiều API ngôn ngữ (hiện tại là Java & C#); Tôi đang tìm một cách bất khả tri về ngôn ngữ để người dùng chỉ định vị từ lọc trên một tập hợp các đối tượng mà nội dung chính xác chỉ được biết đến quy trình máy chủ (được viết bằng Java).

+1

Điều tra về việc tạo DSL đặc biệt là Nội bộ trong trường hợp của bạn. –

+0

Chủ đề này có thể giúp http://stackoverflow.com/questions/5620985/is-there-any-good-dynamic-sql-builder-library-in-java –

+0

Bạn dường như tìm kiếm một thứ gì đó giống như LINQ dường như không tồn tại (chưa). Có thể bạn sẽ tìm thấy một cái gì đó ở đây: http: //stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq –

Trả lời

2

Tôi sẽ xem xét MVEL. Nó hỗ trợ biểu thức của các loại tương tự:

(user.name == 'John Doe') && ((x * 2) - 1) > 20

sử dụng nó một lần trên một dự án thể hiện một số quy tắc kinh doanh cơ bản từ một khách hàng.

+0

Cảm ơn! Bây giờ tôi biết tôi đang tìm kiếm một "ngôn ngữ biểu hiện" tôi đã tìm thấy một loạt các công cụ khác tại http://java-source.net/open-source/expression-languages ​​ – bacar

+0

Nó cũng hỗ trợ các dự án được gọi là/nếp gấp và lọc có thể hữu ích trong trường hợp của bạn: 'familyMembers = (tên trong (familyMembers in users));' '($ in fooList nếu $ .name chứa 'foobie');' –

+0

Liên kết bị hỏng. – thee

0

Không chắc liệu thư viện đó đã tồn tại chưa, nhưng bạn có thể sử dụng groovy để biên dịch/đánh giá các biểu thức đó khi đang di chuyển.

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