JPA - CriteriaQuery с предложением WHERE - PullRequest
4 голосов
/ 24 ноября 2011

Я знаю, что это может быть очень простой вопрос для некоторых из вас, но я с трудом пытаюсь выяснить, как создать простое Выбрать * Из X Где 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"ГДЕ" anotherClass.id = 1L , и где я могу установить "1L", язнаю, это идет в р но куда?

Вот и все.Выглядит просто, но я действительно не знаком с этим CriteriaBuilder, так что надеюсь, что у вас могут быть некоторые ответы.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Параметры задаются в запросах Criteria так же, как в JPQL или собственных запросах, вы задаете их в запросе.

т.е.

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

Обратите внимание, что вы используете позиционный параметр, чтобы использовать именованный параметр, передайте имя параметру ().

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

См http://en.wikibooks.org/wiki/Java_Persistence/Querying#Parameters

1 голос
/ 27 июня 2014

вы пытаетесь использовать объединенную таблицу в выражении предложения where, поэтому вам нужно сначала использовать соединение между таблицами tghe.

...
Join<MyClass1,ANotherClass> pathA = r.join(MyClass.anotherClass);

...

cb.where(cb.equal(pathA.get(AnotherClass_.id), p));

При условии, что у вас созданы классы метамодели.См. Также главу 40 Учебника по Java EE.

С уважением, Томас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...