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.
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
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
@ 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ì. –