В предыдущей статье этой серии мы показали, как сохранять объекты 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″.
Мы можем использовать его в нашем коде:
Query query = 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");
List r = query.executeList();
Как мы можем видеть в приведенном выше примере, запрос com.baeldung.jdo.Товар является классом-кандидатом здесь.
4.2. Фильтр
Фильтр может быть написан на Java, но должен иметь логическое значение:
Query query = pm.newQuery("SELECT FROM com.baeldung.jdo.query.ProductItem");
query.setFilter("status == 'SoldOut'");
List result = query.executeList();
4.3. Методы
JDOQL не поддерживает все методы Java, но он поддерживает различные методы, которые мы можем вызвать из запроса, и может использоваться в широком диапазоне:
Для Eclipse мы можем выполнить следующие действия, чтобы включить аннотированную обработку:
Перейдите в Java Compiler и убедитесь, что уровень соответствия компилятора равен 1.8 или выше
Перейдите в Компилятор Java → Обработка аннотаций и включите настройки для конкретного проекта и включите обработку аннотаций
Перейдите в Компилятор Java → Обработка аннотаций → Путь к фабрике , включите параметры для конкретного проекта, а затем добавьте в список следующие банки: javax.jdo.jar,datanucleus-jdo-query.jar
Приведенная выше подготовка означает, что всякий раз, когда мы компилируем устойчивые классы, процессор аннотаций в datanucleus-jdo-query.jar будет создан класс запроса для каждого класса с аннотацией @PersistenceCapable.
В нашем случае процессор генерирует Элемент продукта класс. Сгенерированный класс имеет почти то же имя, что и постоянный класс, хотя и с префиксом Q.
Мы можем использовать класс запроса для доступа к полям-кандидатам и использовать его доступные методы 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");
List results = 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'");
List results = (List) query.execute();
Имя сущности здесь – com.baeldung.jdo.query.Товарная позиция. Мы не можем использовать только имя класса. Это связано с тем, что JDO не имеет метаданных для определения имени сущности, такого как JPA . Мы определили Товар //p , и после этого мы можем использовать p в качестве псевдонима для ссылки на Товар.
Для получения более подробной информации о синтаксисе JPQL, пожалуйста, проверьте эту ссылку .
8. Заключение
В этой статье мы показали различные языки запросов, поддерживаемые JDO. Мы показали, как сохранять именованные запросы для повторного использования, объяснили концепции JDOQL и показали, как использовать SQL и JPQL с JDO.