JPQL (Java Persistence Query Language):JPQL并非类型安全,需要做类型转换,但是JPQL更加类似SQL,比起Criteria API来说,它更加可读。
JPQL Dynamic Query?(这个和J2EE文档解释是否相符?)
@PersistenceContext(unitName="dq")
EntityManager em;
public long queryFinancialRecordsOfDept(String deptName, String companyName) {
String query = "SELECT d.records " +
"FROM Department d " +
"WHERE d.name = '" + deptName +
"' AND " +
" d.company.name = '" + companyName + "'";
return em.createQuery(query, Long.class).getSingleResult();
}
因为Query是每次生成,每次都可可能不一样,所以很难做cache。效率相对比较低。
Criteria API(typesafe):Criteria API比起Dynamic JPQL来说,性能更好。因为Dynamic JPQL每次都需要做解析。同时Criteria API是类型安全的,不需要做类型转换。但是比起JPQL来说使用起来更加繁琐。
参考资料:
http://www.kumaranuj.com/2013/06/jpa-2-dynamic-queries-vs-named-queries.html
https://docs.oracle.com/javaee/7/tutorial/doc/persistence-intro004.htm#GJISE