2009-05-05 28 views
14

Tôi đã tự hỏi nếu có bất kỳ thư viện có thể được sử dụng để đại diện cho các truy vấn SQL như các đối tượng trong Java.Có thư viện nào để biểu diễn các truy vấn SQL như các đối tượng trong mã Java không?

Trong mã tôi có rất nhiều biến tĩnh của kiểu java.lang.String là các truy vấn SQL được viết tay. Tôi sẽ tìm kiếm thư viện có API thông thạo tốt đẹp cho phép tôi trình bày các truy vấn dưới dạng đối tượng chứ không phải là chuỗi.

Ví dụ:

Query q = select("DATE", "QUOTE") 
    .from("STOCKMARKET") 
    .where(eq("CORP", "?")) 
    .orderBy("DATE", DESC); 

Trả lời

7

Jequel trông tiện lợi khá: http://www.jequel.de/

Ứng dụng này sử dụng giao diện thông thạo, do đó dễ đọc, gần giống với SQL tự nhiên (từ tài liệu):

SqlString sql = select(ARTICLE.OID) 
       .from(ARTICLE, ARTICLE_COLOR) 
       .where(ARTICLE.OID.eq(ARTICLE_COLOR.ARTICLE_OID) 
       .and(ARTICLE.ARTICLE_NO.is_not(NULL))); 

Nó cũng hỗ trợ thực hiện các truy vấn đối với một nguồn dữ liệu với các tham số, do đó, nó cũng xử lý việc tạo các truy vấn được tham số hóa.

+0

Có vẻ tốt. Đó là một cái gì đó như tôi đang tìm kiếm. Chúc mừng! –

+0

Đẹp! Đừng quên quay lại và đăng những phát hiện của bạn. Tôi chỉ phát hiện ra nó một vài ngày trước, và tôi đã không có cơ hội sử dụng nó rất nhiều, nhưng tôi dự định trong tương lai. – matt

+0

Tôi đã liên hệ với nhà phát triển của Jequel khoảng một năm trước. Dự án này dường như đã đi vào chế độ bảo trì trong năm 2008 ... –

2

Apache Empire-db là một lớp cơ sở dữ liệu trừu tượng và kiên trì dữ liệu thành phần quan hệ cho phép các nhà phát triển để có một cách tiếp cận SQL trung tâm nhiều hơn nữa trong việc phát triển ứng dụng hơn bản đồ đối tượng-quan hệ truyền thống khung (ORM).

More đây: https://empire-db.apache.org/

Quaere

http://xircles.codehaus.org/projects/quaere

+0

Dự án đang hoạt động qua chưa? Có rất ít trên trang web của họ. –

+0

Tôi không phải là người dùng nói chung. Chỉ cần nhớ nó là một trong những java-can-have-linq hype năm trước. Từ kho lưu trữ danh sách thư cho thấy dự án không thực sự hoạt động. FWIW, duyệt qua danh sách thư hiển thị cho tôi một số dự án tương tự mà bạn có thể muốn xem qua. JaQu (http://www.h2database.com/html/jaqu.html) Phần dưới cùng của trang cũng tham khảo một số dự án khác có liên quan – Sake

7

http://www.hibernate.org/ lẽ mạnh mẽ nhất thư viện ORM cho Java. Nó có thể làm nhiều hơn thế thì chỉ cần ánh xạ truy vấn đơn giản. Vì vậy, bạn có thể dễ dàng thực hiện nó ở mọi nơi khác trong ứng dụng của bạn. Đối với trường hợp của bạn nó có thể được thực hiện bằng cách nào đó như thế:

public class LookupCodeName 
{ 
    private String code; 
    private String name; 

/*... getter-setters ... */ 
} 

public class someBL { 

public List<LookupCodeName> returnSomeEntity() { 
     SQLQuery sqlQuery = (SQLQuery)((HibernateSession)em).getHibernateSession() 
         .createSQLQuery("SELECT st.name as name, st.code as code FROM someTable st") 
         .addScalar("code") 
         .addScalar("name") 
.setResultTransformer(Transformers.aliasToBean(LookupCodeName.class)); 
    } 
return (List<LookupCodeName>)sqlQuery.list(); 
} 
+0

Vâng, tôi biết Hibernate, nhưng trong ví dụ của bạn vẫn còn SQL được mã hóa cứng là chuỗi ("SELECT st.name như tên, st.code như mã FROM someTable st"). Có lẽ câu hỏi của tôi không đủ rõ ràng, nhưng tôi muốn thay thế các truy vấn chuỗi bằng cách trình bày đối tượng của những người thay vì sử dụng khung công tác mạnh mẽ để thực hiện các truy vấn. –

+0

Pregzt, bạn có thể muốn xem xét tiêu chí Hibernate –

+0

Tôi nghĩ API tiêu chí sẽ kéo theo hướng sai khi có API trình tạo SQL. Trong dự án hiện tại của tôi, các nhà phát triển ban đầu (và đã qua đời) đã sử dụng API tiêu chí và nhóm hiện tại ghét nó. Chúng ta có thể có được một phương thức DAO được thực hiện bằng cách sử dụng SQL nguyên gốc trong một nửa thời gian cần để viết API tiêu chí, vì chúng ta thường xem xét SQL API tiêu chí tạo ra để xác minh tính chính xác của nó. Nếu bạn biết chính xác SQL đã có, tại sao lại đếm trên một trình tạo SQL? – Alan

1

Nếu bạn không muốn để lập bản đồ các truy vấn chuỗi, sau đó bạn phải chú thích lớp học của bạn như một thực thể và ràng buộc nó với bảng sau đó bạn có thể sử dụng hibernate hoặc java kiên trì. Ví dụ sẽ quá phức tạp. Nhưng, cuối cùng truy vấn của bạn sẽ làm thay đổi một cái gì đó như thế này:

tìm danh sách các thực thể:

Criteria c = createCreteria(entityManager, StockMarket.class); 
    // you can add "where" clause by using c.add(Restrictions); 
    // like this: c.add(Restrictions.ilike("name", "%somename%"); where "name" is your entity's field 
    List<StockMarket> smList = c.list(); 

tìm đối tượng bằng id:

StockMarket sm = entityManager.find(StockMarket.class, id); 
12

Querydsl hỗ trợ truy vấn trên các chương trình phụ trợ SQL, JPA và JDO.

Ví dụ trên trở thành:

query.from(stockmarket).where(stockmarket.corp.eq(someVar)) 
    .orderBy(stockmarket.date.desc()) 
    .list(stockmarket.date, stockmarket.quote); 

Querydsl sử dụng hệ mã qua APT để phản ánh một lược đồ SQL với các loại truy vấn Java. Bằng cách này, các truy vấn hoàn toàn an toàn kiểu (hoặc "tuân thủ lược đồ" với SQL).

Tôi là người duy trì Querydsl, vì vậy câu trả lời này là thiên vị.

Tôi đã xuất bản so sánh Querydsl với các khung công tác khác here.

+0

Tôi sẽ upvote để chống lại nó. –

7

Đây là một số thư viện độc quyền tốt để tạo ra typesafe truy vấn SQL động

Ngoài việc trên, luôn luôn có

  • Hibernate/JPA CriteriaQuery
  • MyBatis

dụ của bạn trong jOOQ:

create.select(DATE, QUOTE) 
     .from(STOCKMARKET) 
     .where(CORP.equal(123)) 
     .orderBy(DATE.desc()); 
0

Bạn có thể sử dụng naskarlab/thạo truy vấn:

https://github.com/naskarlab/fluent-query

Ví dụ:

@Test 
public void testSelect() { 
    String expected = "select e0.* from Customer e0"; 

    String actual = new QueryBuilder() 
     .from(Customer.class) 
     .to(new NativeSQL()) 
     .sql() 
     ; 

    Assert.assertEquals(expected, actual); 
} 

Bạn có thể xem chi tiết các ví dụ trong các bài kiểm tra đơn vị của dự án:

https://github.com/naskarlab/fluent-query/blob/master/src/test/java/com/naskar/fluentquery/TestNativeSimpleConventionQueryTest.java

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