【问题标题】:JPA - CriteriaQuery with "WHERE" clauseJPA - 带有“WHERE”子句的 CriteriaQuery
【发布时间】:2012-01-05 05:24:41
【问题描述】:

我知道这对你们中的一些人来说可能是一个非常简单的问题,但我很难找出如何构建一个简单的 Select * From X Where Xa = :myparam使用 CriteriaBuilder

现在,这是我迄今为止设法构建的代码:

    CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery();

    Root<MyClass1> r = cq.from(MyClass1.class);
    cq.select(r);

    ParameterExpression<Long> p = cb.parameter(Long.class);

    cq.where(cb.equal(r.get("anotherClass.id"), p));

    javax.persistence.Query q = getEntityManager().createQuery(cq);

我应用这个查询的类是这个:

@Entity
public class MyClass1 implements Serializable {
    @Id
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ANOTHERCLASS_ID")    
    private AnotherClass anotherClass;
    ...
}

@Entity
public class AnotherClass implements Serializable {
    @Id
    private Long id;
    ...
}

我只需要从myclass1“WHERE”anotherClass.id = 1L中选择所有记录,我在哪里设置“1L”,我知道它进入p 但在哪里?

就是这样。看起来很简单,但是我对CriteriaBuilder这个东西真的不熟悉,所以希望你能得到一些答案。

谢谢。

【问题讨论】:

    标签: java jpa criteria


    【解决方案1】:

    您正在尝试在 where 子句表达式中使用连接表,因此您需要先在 tghe 表之间使用连接。

    ... Join pathA = r.join(MyClass.anotherClass); ... cb.where(cb.equal(pathA.get(AnotherClass_.id), p));

    前提是您已经构建了元模型类。另请参阅 Java EE 教程的第 40 章。

    问候, 托马斯

    【讨论】:

      【解决方案2】:

      Criteria 查询中的参数设置与 JPQL 或本机查询相同,您可以在 Query 上设置它们。

      javax.persistence.Query q = getEntityManager().createQuery(cq);
      q.setParameter(1, 1L);
      

      请注意,您使用的是位置参数,要使用命名参数,请将名称传递给 parameter()。

      ParameterExpression<Long> p = cb.parameter(Long.class, "id");
      ...
      q.setParameter("id", 1L);
      

      看, http://en.wikibooks.org/wiki/Java_Persistence/Querying#Parameters

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-19
        • 2011-07-05
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        相关资源
        最近更新 更多