代码之家  ›  专栏  ›  技术社区  ›  Ben

使用标准API的动态JPA 2.0查询

  •  9
  • Ben  · 技术社区  · 14 年前

    使用JPA2.0的CriteriaBuilder构建动态查询有点笨拙。

    我猜我有一个非常常见的用例:用户提供任意数量的搜索参数x来连接和/或连接:比如:

    select e from Foo where (name = X1 or name = X2 .. or name = Xn )
    

    CriteriaBuilder的方法或不是动态的:

    谓词或(谓词…限制条件)

    思想?样品?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Pascal Thivent    14 年前

    在你的情况下,我宁愿用 Expression#in(Collection) 避免循环和构建化合物 Predicate 动态地:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    
    CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
    Metamodel m = em.getMetamodel();
    EntityType<Foo> Foo_ = m.entity(Foo.class);
    Root<Foo> foo = cq.from(Foo_);
    cq.where(my.get(Foo_.name).in(params));
    

    你可能想查一下 Basic Type-Safe Queries Using the Criteria API and Metamodel API 了解更多详细信息。

        2
  •  1
  •   raghunath    14 年前

    在这段代码中,foo.name将给出编译错误。因为该字段未在中声明。我听不懂。请建议我。

    拉格胡