// 导入所需的包
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
// 定义一个方法,用于动态拼接查询语句
public List<User> findUsersByCriteria(String name, Integer age) {
// 获取EntityManager对象
EntityManager entityManager = getEntityManager();
// 创建CriteriaBuilder对象
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
// 创建CriteriaQuery对象,并指定返回结果类型
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
// 创建Root对象,指定要查询的实体类
Root<User> root = criteriaQuery.from(User.class);
// 创建一个Predicate列表,用于存储查询条件
List<Predicate> predicates = new ArrayList<>();
// 如果name参数不为空,添加name字段的查询条件
if (name != null) {
predicates.add(criteriaBuilder.equal(root.get("name"), name));
}
// 如果age参数不为空,添加age字段的查询条件
if (age != null) {
predicates.add(criteriaBuilder.equal(root.get("age"), age));
}
// 将所有的查询条件进行and操作
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 执行查询,并返回结果
return entityManager.createQuery(criteriaQuery).getResultList();
}
上面的代码演示了如何使用Java的JPA动态拼接查询语句。通过使用CriteriaBuilder、CriteriaQuery和Predicate等类,我们可以根据不同的查询条件动态地构建查询语句。在上面的例子中,我们定义了一个findUsersByCriteria方法,该方法接受name和age两个参数作为查询条件。根据参数的值,我们动态地构建查询语句,并返回查询结果。