MyTetra Share
Делитесь знаниями!
Выполнение JPQL-запроса
Время создания: 03.12.2019 15:39
Раздел: INFO - Development - CUBA - REST
Запись: wwwlir/Tetra/master/base/1575358762yopr2q9gue/text.html на raw.githubusercontent.com

Выполнение JPQL-запроса (GET)

Перед выполнением запроса с помощью REST API необходимо описать его в конфигурационном файле. В корневом пакете модуля web (например, com.company.sales) необходимо создать файл rest-queries.xml. Затем этот файл объявляется в файле свойств приложения модуля web (web-app.properties):

cuba.rest.queriesConfig = +com/company/sales/rest-queries.xml 

Содержимое файла rest-queries.xml:

<?xml version="1.0"?>
<queries xmlns="http://schemas.haulmont.com/cuba/rest-queries.xsd">
    <query name="ordersAfterDate" entity="sales$Order" view="order-edit-view">
        <jpql><![CDATA[select o from sales$Order o where o.date >= :startDate and o.date <= :endDate]]></jpql>
        <params>
            <param name="startDate" type="java.util.Date"/>
            <param name="endDate" type="java.util.Date"/>
        </params>
    </query>
</queries> 

Для выполнения JPQL запроса, необходимо выполнить GET http-запрос к REST API:

http://localhost:8080/app/rest/v2/queries/sales$Order/ordersAfterDate?startDate=2016-11-01&endDate=2017-11-01

Части URL:

  • sales$Order - имя извлекаемой сущности.
  • ordersAfterDate - имя запроса из конфигурационного файла.
  • startDate и endDate - параметры запроса со значениями.

OAuth-токен должен быть передан в заголовке запроса Authorization с типом Bearer.

Метод возвращает JSON-массив со списком извлеченных экземпляров сущности:

[
  {
    "_entityName": "sales$Order",
    "_instanceName": "00002",
    "id": "b2ad3059-384c-3e03-b62d-b8c76621b4a8",
    "date": "2016-12-31",
    "description": "New Year party set",
    "number": "00002",
    "items": [
      {
        "_entityName": "sales$OrderItem",
        "_instanceName": "Jack Daniels",
        "id": "0c566c9d-7078-4567-a85b-c67a44f9d5fe",
        "price": 50.7,
        "name": "Jack Daniels"
      },
      {
        "_entityName": "sales$OrderItem",
        "_instanceName": "Hennessy X.O",
        "id": "c01be87b-3f91-7a86-50b5-30f2f0a49127",
        "price": 79.9,
        "name": "Hennessy X.O"
      }
    ],
    "customer": {
      "_entityName": "sales$Customer",
      "_instanceName": "Morgan Collins",
      "id": "5d111245-2ed0-abec-3bee-1a196da92e3e",
      "firstName": "Morgan",
      "lastName": "Collins"
    }
  }
] 

Список других возможных параметров для метода выполнения запросов можно посмотреть в Swagger документации.


Выполнение JPQL-запроса (POST)

JPQL-запрос также может быть выполнен с помощью POST-запроса. Это необходимо для случая, когда параметр JPQL-запроса является коллекцией. В файле конфигурации JPQL-запросов для REST API тип параметра-коллекции должен заканчиваться символами []: java.lang.String[], java.util.UUID[] и т.п.

<?xml version="1.0"?>
<queries xmlns="http://schemas.haulmont.com/cuba/rest-queries.xsd">
    <query name="ordersByIds" entity="sales$Order" view="order-edit-view">
        <jpql><![CDATA[select o from sales$Order o where o.id in :ids and o.status = :status]]></jpql>
        <params>
            <param name="ids" type="java.util.UUID[]"/>
            <param name="status" type="java.lang.String"/>
        </params>
    </query>
</queries> 

Параметры JPQL-запроса должны быть переданы в теле HTTP-запроса в JSON map:

{
  "ids": ["c273fca1-33c2-0229-2a0c-78bc6d09110a", "e6c04c18-c8a1-b741-7363-a2d58589d800", "d268a4e1-f316-a7c8-7a96-87ba06afbbbd"],
  "status": "ready"
} 

URL POST-запроса:

http://localhost:8080/app/rest/v2/queries/sales$Order/ordersByIds?returnCount=true


 
MyTetra Share v.0.59
Яндекс индекс цитирования