当前位置: 首页 > 面试题库 >

具有多个参数的JPA Criteria API

狄高畅
2023-03-14
问题内容

我需要制作一个使用JPA Criteria
API和多个参数的搜索方法。现在的问题是,并非每个参数都是必需的。因此某些可能为null,因此不应将其包含在查询中。我已经使用CriteriaBuilder进行了尝试,但看不到如何使其工作。

使用Hibernate Criteria API,这相当容易。只需创建条件,然后添加限制。

Criteria criteria = session.createCriteria(someClass.class);
if(someClass.getName() != null) {
   criteria.add(Restrictions.like("name", someClass.getName());
}

如何使用JPA的Criteria API达到相同的目的?


问题答案:

概念是构造javax.persistence.Predicate数组,该数组仅包含我们要使用的谓词:

要查询的示例实体:

@Entity
public class A {
    @Id private Long id;    
    String someAttribute;
    String someOtherAttribute;
    ...
}

查询本身:

    //some parameters to your method
    String param1 = "1";
    String paramNull = null;

    CriteriaBuilder qb = em.getCriteriaBuilder();
    CriteriaQuery cq = qb.createQuery();
    Root<A> customer = cq.from(A.class);

    //Constructing list of parameters
    List<Predicate> predicates = new ArrayList<Predicate>();

    //Adding predicates in case of parameter not being null
    if (param1 != null) {
        predicates.add(
                qb.equal(customer.get("someAttribute"), param1));
    }
    if (paramNull != null) {
        predicates.add(
                qb.equal(customer.get("someOtherAttribute"), paramNull));
    }
    //query itself
    cq.select(customer)
            .where(predicates.toArray(new Predicate[]{}));
    //execute query and do something with result
    em.createQuery(cq).getResultList();


 类似资料:
  • 问题内容: 我有一个源输入 input.txt 我想将这些输入馈入程序,如下所示: 所以我尝试使用 xargs ,但是没有运气。 它给 但我想要 任何的想法? 问题答案: 到目前为止给出的解决方案都无法正确处理包含空格的文件名。如果文件名包含“或”,有些甚至会失败。如果输入文件是由用户生成的,则应该准备好使用令人惊讶的文件名。 GNU Parallel 很好地处理了这些文件名,并为您(至少)提供了

  • 我有寻呼路线/电影吗?categoryId=21213在这个页面上,我有一部分演员,点击它应该重定向到/movies?categoryId=21213/演员?actorId=23434234 我应该如何正确地描述用一个actor来渲染我最新的组件?我试过了 但这不起作用

  • 可以使用零个或多个参数定义Clojure函数。 传递给函数的值称为arguments ,参数可以是任何类型。 参数的数量是函数的arity。 本章讨论了一些具有不同arities的函数定义。 在以下示例中,函数demo使用每个函数定义的多个参数进行定义。 (defn demo [] (* 2 2)) (defn demo [x] (* 2 x)) (defn demo [x y] (* 2 x y

  • 问题内容: 我知道关于从Java执行流程有很多解决的问题,但是我无法使用提供的答案解决问题。我正在尝试从Java应用程序创建postgresql数据库备份。我使用以下代码 执行以上代码后,出现以下错误: 仅当备份文件的路径包含空格时才出现问题,否则将创建备份。我试图在文件路径中同时使用斜杠和反斜杠,但我引用了文件路径,但每次都遇到相同的错误。可以从命令提示符处执行命令。 我做错了。关于Proces

  • 问题内容: 我正在尝试创建一个,但是在方法中添加一些错误。 请帮助我如何添加参数以及如何将其传递给在其中声明a和的另一个函数。 我的另一个功能是insertData(…) 我正在尝试创建一个并将其传递给函数。但是,当我在第一个函数中调用方法时,它将引发错误。 错误是 你调用的对象是空的 问题答案: 如果不调用其构造函数(新),则不能使用任何变量(例如,参考对象),但是不能使用新变量直接对其进行初始