@Generated("EclipseLink")
@StaticMetamodel(Customer.class)
public class Customer_ {
··public static volatile SingularAttribute
··public static volatile SingularAttribute
··public static volatile SingularAttribute
··public static volatile SingularAttribute
··public static volatile SingularAttribute
··public static volatile SingularAttribute
}
В классе статической метамодели каждый атрибут сущности Customer определяется подклассом javax.persistence.metamodel.Attribute (CollectionAttribute, ListAttribute, MapAttribute, SetAttribute или SingularAttribute). Каждый из этих атрибутов использует обобщения и является строго типизированным (например, SingularAttribute
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery
Root
criteriaQuery.select(c). where(builder.greaterThan(c.get(Customer_.age), 40));
Query query = em.createQuery(criteriaQuery). getResultList();
List
Опять-таки это лишь примеры того, что вы можете сделать с помощью Criteria API. Это очень богатый API-интерфейс, который всесторонне охарактеризован в главах 5 и 6 спецификации JPA 2.1.
Классы, используемые в случае со статической метамоделью, например Attribute или SingularAttribute, являются стандартными и определены в пакете javax.persistence.metamodel. Однако генерирование классов статической метамодели зависит от реализации. EclipseLink использует внутренний класс CanonicalModelProcessor. Этот класс может вызываться вашей интегрированной средой разработки, пока вы разрабатываете Java-команду, Ant-задание или Maven-плагин.
«Родные» запросы
JPQL обладает очень богатым синтаксисом, который позволяет обрабатывать сущности в любой форме и обеспечивает переносимость между базами данных. JPA дает возможность использовать специфические особенности баз данных благодаря «родным» запросам. «Родные» запросы принимают «родной» SQL-оператор (SELECT, UPDATE или DELETE) в качестве параметра и возвращают экземпляр Query для выполнения этого оператора. Однако нельзя рассчитывать на переносимость «родных» запросов между базами данных.
Если код не является переносимым, то почему бы не использовать JDBC-вызовы? Главная причина, в силу которой следует задействовать «родные» запросы JPA, состоит в том, что результат запроса будет автоматически преобразован обратно в сущности. Если вы захотите извлечь все экземпляры сущности Customer из базы данных с использованием SQL, то вам потребуется прибегнуть к методу EntityManager.createNativeQuery(), принимающему в качестве параметров SQL-запрос и класс-сущность, в который должен быть отображен результат.