Рубрики
Без рубрики

Введение в запросы JDO 2/2

Узнайте о различных языках запросов, поддерживаемых JDO.

Автор оригинала: baeldung.

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″.

Мы можем использовать его в нашем коде:

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, но он поддерживает различные методы, которые мы можем вызвать из запроса, и может использоваться в широком диапазоне:

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");
List result = (List) query.execute(10);

Это также может быть достигнуто с помощью метода setParameters :

Query query = pm.newQuery(
  "SELECT FROM com.baeldung.jdo.query.ProductItem "
  + "WHERE price < :threshold");
query.setParameters("double threshold");
List result = (List) query.execute(10);

Мы можем сделать это неявно, не определяя тип параметра:

Query query = pm.newQuery(
  "SELECT FROM com.baeldung.jdo.query.ProductItem "
  + "WHERE price < :threshold");
List result = (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 мы можем выполнить следующие действия, чтобы включить аннотированную обработку:

  1. Перейдите в Java Compiler и убедитесь, что уровень соответствия компилятора равен 1.8 или выше
  2. Перейдите в Компилятор Java → Обработка аннотаций и включите настройки для конкретного проекта и включите обработку аннотаций
  3. Перейдите в Компилятор Java → Обработка аннотаций → Путь к фабрике , включите параметры для конкретного проекта, а затем добавьте в список следующие банки: javax.jdo.jar, datanucleus-jdo-query.jar

Приведенная выше подготовка означает, что всякий раз, когда мы компилируем устойчивые классы, процессор аннотаций в datanucleus-jdo-query.jar будет создан класс запроса для каждого класса с аннотацией @PersistenceCapable.

В нашем случае процессор генерирует Элемент продукта класс. Сгенерированный класс имеет почти то же имя, что и постоянный класс, хотя и с префиксом Q.

5.3. Создайте типизированный запрос JDOQL:

JDOQLTypedQuery tq = 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");
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.

Примеры кода в статье можно найти на GitHub .