// 获得实体管理器 EntityManager em = ... // 建立SQL查询 String getByFirstName = "SELECT * FROM contacts c WHERE c.first_name = ?1"; // 创建查询实例 Query query = em.createNativeQuery(getByFirstName, Contact.class); // 设置查询参数 query.setParameter(1, "John"); // 获取结果 List contacts = query.getResultList();
// 获得实体管理器 EntityManager em = ... // 建立JPQL查询 String getByFirstName = "SELECT c FROM Contact c WHERE c.firstName = :firstName"; // 创建查询实例 TypedQuery<Contact> query = em.createQuery(getByFirstName, Contact.class); // 设置查询参数 query.setParameter("firstName", "John"); // 获取结果 List<Contact> contacts = query.getResultList();
// 获得实体管理器 EntityManager em = ... // 获得Criteria建立器 CriteriaBuilder cb = em.getCriteriaBuilder(); // 建立Criteria查询 CriteriaQuery<Contact> query = cb.greateQuery(Contact.class); // 创建查询Root Root<Contact> root = query.from(Contact.class); // 创建firstName的查询条件,使用静态元模型 Predicate firstNameIs = cb.equal(root.get(Contact_.firstName, "John")); // 指定查询的where条件 query.where(firstNameIs); // 创建查询并获取结果 TypedQuery<Contact> q = em.createQuery(query); List<Contact> contacts = q.getResultList();
Criteria API对于创建动态查询是一个极好的工具。它使得创建动态查询更简便,因为我们处理的是对象,而不是处理查询的字符串。缺点在于随着查询的复杂度的增加,,查询定义对象的创建也会变得很繁琐,代码会更难读。