2015-07-01 25 views
7

Tôi đang tìm cách xác thực truy vấn JPA theo lập trình.Cách xác thực JPQL (truy vấn JPA) theo lập trình

Trong giao dịch (Mùa xuân), tôi có danh sách các truy vấn để chạy. Các truy vấn này có thể chứa các lỗi cú pháp mà tôi muốn nắm bắt để giao dịch có thể tiếp tục.

Ý tưởng đầu tiên của tôi là sử dụng EntityManager và tạo và thực hiện truy vấn của tôi và trong trường hợp không thành công, tôi có thể dễ dàng bắt ngoại lệ, đăng nhập cảnh báo và tiếp tục.

Vấn đề là khi có vấn đề xảy ra, giao dịch được gắn cờ cho rollbackOnly để giao dịch hiện tại của tôi được cuộn lại mà không phải là những gì tôi muốn.

Trong mã giả, nó đi nhiều hay ít như thế này:

EntityManager em = ...; 
    em.getTransaction().begin(); 
    List<String> queries = Arrays.asList("select e from Department d", 
      "select d from Department d"); 
    for(String query:queries) { 
     TypedQuery<Department> typedQuery = em.createQuery(query, Department.class); // This can throw an exception 
     List<Department> deps = typedQuery.getResultList(); // This can also throw an exception 
     //... do some stuff with the departements 
    } 

Việc thay thế tôi thấy cho đến nay là để tạo ra một EntityManager từ một bản gốc (em.getEntityManagerFactory().createEntityManager()), chạy đầu tiên truy vấn của tôi trong một đó và sau đó thực hiện lại chúng (trong trường hợp thành công) trong bản gốc, nhưng điều này thực sự không hiệu quả và trông khá xấu xí.

Tôi đang sử dụng EclipseLink như một thực hiện JPA và tôi không thể chuyển sang thực hiện JPA.

+0

EclipseLink nên có một 'mở rộng jpql.validation', mà có thể xác nhận biểu JPQL với HermesParser. – meskobalazs

+0

Nếu bạn có thể sử dụng các chú thích, thì có lẽ cái gì đó như @Transactional (noRollbackFor = BadSqlGrammarException.class) – 6ton

+0

@ 6ton không may, một cái gì đó này nội bộ để EclipseLink (và có thể JPA), do đó thay đổi các chú thích sẽ không chanfe bất cứ điều gì. –

Trả lời

0

Tôi cho rằng bạn muốn xác thực hợp lệ thời gian cho JPQL. Không có cách nào để kiểm tra xem cú pháp truy vấn có đúng không.

Để thực hiện công việc mà bạn muốn, sử dụng các tiêu chuẩn api thay vì JPQL. Kiểm tra tài liệu cho api tiêu chí. Bạn sẽ cần phải sử dụng metamodel cho thời gian biên dịch kiểm tra

+0

Làm thế nào tôi có thể sử dụng CriteriaBuilder với một chuỗi lấy từ một cơ sở dữ liệu? –

+0

Vui lòng chech tài liệu chính thức: http://docs.oracle.com/javaee/6/tutorial/doc/gjrij.html – fotis

+0

Tiêu chí api sử dụng các hoạt động cấp đối tượng. – fotis

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