CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.where(cb.equal(pet.get("name"), "Fido"));
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Чтобы создать строковый запрос, укажите имена атрибутов классов сущностей непосредственно в виде строк вместо указания атрибутов класса метамодели. Например, этот запрос находит все объекты сущности Pet
, у которых значение атрибута name
равно Fido
:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.where(cb.equal(pet.get("name"), "Fido"));
Имя атрибута указывается в виде строки. Этот запрос соответствует следующему запросу метамодели:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Metamodel m = em.getMetamodel();
EntityType<Pet> Pet_ = m.entity(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.where(cb.equal(pet.get(Pet_.name), "Fido"));
Примечание: Ошибки несоответствия типов в строковых запросах не будут появляться до тех пор, пока код не будет выполнен, в отличие от вышеупомянутого запроса метамодели, где несоответствия типов будут обнаружены во время компиляции. |
Объединения указываются так же:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Owner, Address> address = pet.join("owners").join("addresses");
Все условные выражения, выражения методов, методы навигации по путям и методы фильтрации результатов, используемые в запросах метамодели, также могут использоваться в строковых запросах. В каждом случае атрибуты указываются с использованием строк. Например, вот строковый запрос, который использует выражение in
:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.where(pet.get("color").in("brown", "black"));
Вот строковый запрос, который упорядочивает результаты в порядке убывания даты:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.select(pet);
cq.orderBy(cb.desc(pet.get("birthday")));
Назад | Вперёд | Содержание |