JPA поддерживает два способа выражения запросов для извлечения сущностей и других постоянных данных из базы данных: заявления о запросе (язык запросов Java, JPQL) и API Criteria (критерии API). JPQL-это независимый от базы данных оператор запроса, который используется для эксплуатации моделей логической сущности, а не для моделей физических данных. Условный API - это создание условий запроса на основе модели сущности
1. Начало работы с заявлениями о постоянных запросах Java
Кода -код выглядит следующим образом: список <Person> persons = entitymanager.createquery («Выберите P из человека p»). GetResultist ();
1. Это утверждение запроса аналогично SQL. Но разница между ним и реальным SQL заключается в том, что вместо того, чтобы делать запрос выбора из таблицы, он определяет сущность из модели домена приложения.
2. В пункте «Выбрать запроса» только перечислен псевдоним объекта запроса. Если вы запросите только в определенном столбце, вы можете использовать оператор Dot (.) Для навигации по свойствам объекта. Как показано ниже:
Кода кода выглядит следующим образом: List <string> persons = entitymanager.createquery («Выберите p.firstname из человека p»). GetResultist ();
1.1. Критерии фильтра
Как и SQL, JPQL также поддерживает, где положения, которые используются для фильтрации критериев поиска. Включает большинство операторов, таких как: in, между, как, подстроение выражения функции, длина и т. Д.
Копия кода выглядит следующим образом: список <Person> persons = entitymanager.createquery («Выберите P из человека P, где P.age> 23»). GetResultist ();
1.2. Результаты проекции
Если объем запросов данных относительно большой, вы можете использовать проекцию для запроса только полезных столбцов.
Кода кода выглядит следующим образом:/список проектов <object> persons = entitymanager.createquery («Выберите p.firstname, p.age от человека p»). GetResultist ();
1.3. Запрос агрегации
Синтаксис агрегатного запроса JPQL аналогичен SQL. Например, счет
Кода -код выглядит следующим образом: список <Integer> count = entitymanager.createquery («Выберите count (p) из человека p»). GetResultist ();
1.4. Параметры запроса
JPQL поддерживает два типа синтаксиса связывания параметров.
1. Представление параметров позиции
Где параметр указан в строке запроса, который является номером, который следует за параметрами сразу после отметки вопроса (?). При выполнении запроса разработчик указывает параметры, которые следует заменить
Query Query = EntityManager.CreateQuery ("Выберите P из человека P, где p.age =? 1 и p.firstname =? 2"); Query.setParameter (1,21); Query.SetParameter (2, "jack"); 2. названная нотация параметров
Следуя толстой кишке (:) и указав ее в строке запроса, разработчик указывает имя параметра, которое следует заменить при выполнении запроса
Query Query = EntityManager.CreateQuery («Выберите P из человека P, где p.age =: age и p.firstname =: name»); Query.setParameter («Age», 21); Query.SetParameter («name», «jack»);
2. Определите запрос
JPA предоставляет интерфейсы Query и TypedQuery (представленные JPA 2.0) для настройки и выполнения запросов. Запрос возвращает тип объекта, в то время как TypedQuery возвращает указанный тип класса.
// Нет указанного типа, return Type type Query Q = entityManager.createquery («Выберите P из человека p»); // указать тип возврата как тип человека TypedQuery <Person> Q1 = EntityManager.Createquery («Выберите P от человека p», person.class);
2.1. Динамическое определение запроса
Двигатель запроса JPA может анализировать строки JPQL в синтаксисные деревья, получить метаданные карты объектов объектов в выражениях, а затем генерировать эквивалент SQL. Следовательно, есть два способа проведения динамического запроса.
1. Строка. Строка
Совет: вызовет проблемы с инъекцией SQL
/** * Условия запроса на строительство динамического сплайсинга * * @param имя * @param age * @return */public Static String QuerypersonJpql (String name, int age) {String QueryQl = "SELECT P из человека P, где p.firStname = '" + name + "' и p.age =" + age; return QueryQl;} // Call Query Query = entityManager.createequery (QuerypersonJpql ("jack", 21)); 2. Динамическая параметризованная конструкция условий запроса (рекомендуется)
/** * Динамические параметризованные условия строительного запроса * * @return */public static String Querypersonjpqlbyparams () {String Queryql = "select p из человека p, где p.firstname =: name and p.age =: age"; return QueryQl;} Query Query = entityManager.createequery (QuerypersonJpqlbyparams ()); Query.setParameter («Имя», «Джек»); Query.SetParameter («Возраст», 21);2.2. Названо определение запроса
Названный Query - мощный инструмент. Используйте аннотацию @namedquery, чтобы определить названный запрос, который можно поместить поверх определения класса любого объекта. Эта аннотация определяет имя запроса и его текст.
Совет: Названный запрос помещается в класс объектов, соответствующий результату запроса
@Entity@chamequery (name = "findbyage", Query = "select p из человека P, где p.age =: age") public class person {// опущено} Имя, определенное в Tip: названный Queckery должен быть уникальным во всем единице устойчивости, в противном случае в операции возникнут ошибка.
например:
Кода -копия выглядит следующим образом:
Исключение в потоке «Основное» org.hibernate.duplicatemappingException: дублирование отображения запросов findbyage at org.hibernate.boot.internal.inflightmetadatacollectorimpl.checkqueryName
Вызов
Кода -копия выглядит следующим образом:
Список <person> people = entitymanager.createNamedQuery ("findbyage", person.class) .setParameter ("Age", 21) .getResultist ();
Если класс определяет два или более названных запросов, он должен быть размещен в @namedqueries ()
2.3. Связывание параметров
Через предыдущий пример мы видим, что существуют два способа связывания параметров: 1. Привязка параметризации положения. 2. Назовите параметризованную привязку. Все они связаны с помощью метода SetParameter интерфейса запроса.
1. Положение параметризация
Typedquery <x> setParameter (int position, значение объекта);
2. Имя параметризация
Typedquery <x> setParameter (name строка, значение объекта);
Первым является позиция параметризованного привязки. Если позиция меняется, связанный код должен быть изменен. Второй тип рекомендуется.
2.4. Выполнить запрос
Интерфейс запроса и интерфейс TypedQuery предоставляют три разных способа выполнения запросов.
1.ExecuteUpdate
Используется для выполнения обновлений или удаления пакетов
2. Getsingleresult
Получите один набор результатов. Если данные не будут получены, будет брошено Noresultexception. Если будет получено несколько деталей данных, будет выброшено неуника
3. GetResultList
Получите соответствующий набор результатов и укажите порядок набора. Список должен использоваться в качестве типа возвращаемого значения. Если данные не получены, возвращается пустой набор, и исключение не брошено на исключение
2.5. Страница
Запрос на страницах может быть заполнен с помощью методов setFirStresult () и setMaxResults ()
Номер страницы запроса равен 0, а 2 части данных отображаются на каждой странице
Кода -копия выглядит следующим образом:
Список <person> people = entitymanager.createquery («Выберите P из человека p», person.class) .setfirstresult (0) .setmaxresults (2) .getResultist ();
Совет: не может быть использован для запросов, связанных с помощью отношений сбора, потому что эти запросы могут вернуть дубликаты значений.
2.6 Тайм -аут запроса
Если приложению необходимо установить ограничение на время ответа на запрос, вы можете установить свойство javax.persistence.query.timeout в запросе (введено JPA 2.0) или использовать его как часть свойства. Это свойство определяет количество == миллисекунды, разрешенное для запуска до завершения запроса. Если время ожидания запроса, будет брошена QueryTimeOutException.
TypedQuery <Person> Query = entityManager.createquery ("select p из человека p", person.class); // подразделение - milliseconds javax.persistence.query.timeoutquery.sethint ("javax.persistence.query.timeout", 5000); List <Person> people = Query.getResultList ();2.7 Пакетные обновления и удаления
Сущность обновления пакетного обновления завершена через оператор обновления. Удаление партии сущностей осуществляется с помощью операторов удаления. Оба указывают свойства сущности и ее класса.
EntityManager.getTransaction (). begin (); Query Query = EntityManager.Createquery («Обновление человека p set p.firstname =: name, где p.id =: id»); Query.setParameter («name», «xiaobai»); Query.setParameter («id», 2); Query.executupdate (); EntityManager.createequery ("Удалить человек p, где p.id =: id"); Query1.setParameter ("id", 9); Query1.executeUpdate (); EntityManager.getTransaction (). Commit ();3. Предложения по использованию запроса JPQL
В прикладных системах количество запросов обычно используется больше, чем добавление, изменение и удаление. Поэтому особенно важно использовать запрос и отображать разумно.
1. Рекомендуется использовать с именем Query (названный
Программы, предоставленные на стойкостью, обычно используют предварительные методы для использования именованных запросов как часть фазы инициализации программы. Это позволяет избежать системы непрерывного анализа JPQL и генерирования SQL.
2. Используйте проекцию, чтобы сначала получить небольшое количество столбцов.
Запрос JPA обычно возвращает все столбцы всего объекта, но для огромного объема данных необходимо использовать не все столбцы объектов. Тогда мы можем использовать проекцию, чтобы справиться с этим.
Список <list <object [] >> persons = entitymanager.createquery («Выберите новый список (первый раз, возраст) от человека p"). GetResultist (); для (объект o: люди) {system.out.println (o);} // Результат выхода [Джек, 21] [Джек, 21] [Джек, 21] [лили.Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.