1. Обзор
В предыдущей статье этой серии мы показали, как сохранять объекты Java в различных хранилищах данных. Для получения более подробной информации, пожалуйста, ознакомьтесь с Руководством по объектам данных Java .
JDO поддерживает различные языки запросов, чтобы обеспечить разработчику гибкость в использовании языка запросов, с которым он наиболее знаком.
2. Языки запросов JDO
JDO поддерживает следующие языки запросов:
- JDOQL – язык запросов, использующий синтаксис Java
- Типизированный JDOQL – следующий синтаксису JDOQL, но предоставляющий API для облегчения использования запросов.
- SQL – используется только для СУБД.
- JPQL – предоставляется Datanucleus, но не входит в спецификации JDO.
3. API запросов
3.1. Создание запроса
Чтобы создать запрос, нам нужно указать язык, а также строку запроса :
Query query = pm.newQuery( "javax.jdo.query.SQL", "select * from product_item where price < 10");
Если мы не указываем язык, по умолчанию используется JDOQL:
Query query = pm.newQuery( "SELECT FROM com.baeldung.jdo.query.ProductItem WHERE price < 10");
3.2. Создание именованного запроса
Мы также можем определить запрос и ссылаться на него по его сохраненному имени.
Для этого мы сначала создаем Элемент продукта класс:
@PersistenceCapable public class ProductItem { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT) int id; String name; String status; String description; double price; //standard getters, setters & constructors }
Затем мы добавим конфигурацию класса в файл META-INF/package.jdo , чтобы определить запрос и назвать его:
Мы определили запрос с именем ” PriceBelow10″.
Мы можем использовать его в нашем коде:
Queryquery = pm.newNamedQuery( ProductItem.class, "PriceBelow10"); List items = query.executeList();
3.3. Закрытие запроса
Чтобы сэкономить ресурсы, мы можем закрыть запросы:
query.close();
Эквивалентно, мы можем закрыть определенный набор результатов, передав его в качестве параметра методу close() :
query.close(ResultSet);
3.4. Составление запроса
Если мы хотим проверить запрос, мы можем вызвать метод compiler() :
query.compile();
Если запрос неверен, то метод вызовет исключение Jboexception.
4. JDOQL
JDOQL-это объектно-ориентированный язык запросов, предназначенный для обеспечения возможностей языка SQL и сохранения отношений объектов Java в модели приложения.
Запросы JDOQL могут быть определены в однострочной форме.
Прежде чем мы погрузимся глубже, давайте рассмотрим некоторые основные концепции:
4.1. Класс кандидатов
Класс-кандидат в JDOQL должен быть устойчивым классом. Мы используем полное имя класса вместо имени таблицы на языке SQL:
Query query = pm.newQuery("SELECT FROM com.baeldung.jdo.query.ProductItem"); Listr = query.executeList();
Как мы можем видеть в приведенном выше примере, запрос com.baeldung.jdo.Товар является классом-кандидатом здесь.
4.2. Фильтр
Фильтр может быть написан на Java, но должен иметь логическое значение:
Query query = pm.newQuery("SELECT FROM com.baeldung.jdo.query.ProductItem"); query.setFilter("status == 'SoldOut'"); Listresult = query.executeList();
4.3. Методы
JDOQL не поддерживает все методы Java, но он поддерживает различные методы, которые мы можем вызвать из запроса, и может использоваться в широком диапазоне:
query.setFilter("this.name.startsWith('supported')");
Для получения более подробной информации о поддерживаемых методах, пожалуйста, проверьте эту ссылку .
4.4. Параметры
Мы можем передавать значения в запросы в качестве параметров. Мы можем либо явно, либо неявно определить параметры.
Чтобы явно определить параметр:
Query query = pm.newQuery( "SELECT FROM com.baeldung.jdo.query.ProductItem " + "WHERE price < threshold PARAMETERS double threshold"); Listresult = (List ) query.execute(10);
Это также может быть достигнуто с помощью метода setParameters :
Query query = pm.newQuery( "SELECT FROM com.baeldung.jdo.query.ProductItem " + "WHERE price < :threshold"); query.setParameters("double threshold"); Listresult = (List ) query.execute(10);
Мы можем сделать это неявно, не определяя тип параметра:
Query query = pm.newQuery( "SELECT FROM com.baeldung.jdo.query.ProductItem " + "WHERE price < :threshold"); Listresult = (List ) query.execute(10);
5. Типизированный JDOQL
Чтобы использовать API JDOQLTypedQuery, нам нужно подготовить среду.
5.1. Настройка Maven
... org.datanucleus datanucleus-jdo-query 5.0.2 maven-compiler-plugin 1.8 1.8
Последними версиями этих зависимостей являются datanucleus-jdo-query и maven-compiler-plugin.
5.2. Включение обработки аннотаций
Для Eclipse мы можем выполнить следующие действия, чтобы включить аннотированную обработку:
- Перейдите в Java Compiler и убедитесь, что уровень соответствия компилятора равен 1.8 или выше
- Перейдите в Компилятор Java → Обработка аннотаций и включите настройки для конкретного проекта и включите обработку аннотаций
- Перейдите в Компилятор Java → Обработка аннотаций → Путь к фабрике , включите параметры для конкретного проекта, а затем добавьте в список следующие банки: javax.jdo.jar, datanucleus-jdo-query.jar
Приведенная выше подготовка означает, что всякий раз, когда мы компилируем устойчивые классы, процессор аннотаций в datanucleus-jdo-query.jar будет создан класс запроса для каждого класса с аннотацией @PersistenceCapable.
В нашем случае процессор генерирует Элемент продукта класс. Сгенерированный класс имеет почти то же имя, что и постоянный класс, хотя и с префиксом Q.
5.3. Создайте типизированный запрос JDOQL:
JDOQLTypedQuerytq = pm.newJDOQLTypedQuery(ProductItem.class); QProductItem cand = QProductItem.candidate(); tq = tq.filter(cand.price.lt(10).and(cand.name.startsWith("pro"))); List results = tq.executeList();
Мы можем использовать класс запроса для доступа к полям-кандидатам и использовать его доступные методы Java.
6. SQL
JDO поддерживает язык SQL в случае, если мы используем СУБД.
Давайте создадим SQL-запрос:
Query query = pm.newQuery("javax.jdo.query.SQL","select * from " + "product_item where price < ? and status = ?"); query.setClass(ProductItem.class); query.setParameters(10,"InStock"); Listresults = query.executeList();
Мы использовали класс set() для запроса, чтобы получить объекты Product Item при выполнении запроса. В противном случае он извлекает тип Object .
7. JPQL
JDO DataNucleus предоставляет язык JPQL.
Давайте создадим запрос с помощью JPQL:
Query query = pm.newQuery("JPQL","select i from " + "com.baeldung.jdo.query.ProductItem i where i.price < 10" + " and i.status = 'InStock'"); Listresults = (List ) query.execute();
Имя сущности здесь – com.baeldung.jdo.query.Товарная позиция. Мы не можем использовать только имя класса. Это связано с тем, что JDO не имеет метаданных для определения имени сущности, такого как JPA . Мы определили Товар //p , и после этого мы можем использовать p в качестве псевдонима для ссылки на Товар.
Для получения более подробной информации о синтаксисе JPQL, пожалуйста, проверьте эту ссылку .
8. Заключение
В этой статье мы показали различные языки запросов, поддерживаемые JDO. Мы показали, как сохранять именованные запросы для повторного использования, объяснили концепции JDOQL и показали, как использовать SQL и JPQL с JDO.
Примеры кода в статье можно найти на GitHub .