4.1. 预定义 JPQL 查询配置

在 CUBA 应用程序中,预定义的 JPQL 查询语句需要写在特定的配置文件中,这些配置文件是由 web 或者 portal 模块的 cuba.rest.queriesConfig 应用程序属性来指定,比如在 web-app.properties 文件中:

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

rest-queries.xml 这个文件必须放在 web 或者 portal 模块的根目录(比如 com.company.myapp)。文件内容格式是由 rest-queries.xsd shema 定义。示例:

<?xml version="1.0"?>
<queries xmlns="http://schemas.haulmont.com/cuba/rest-queries.xsd">
    <query name="carByVin" entity="sample$Car" view="carEdit">
        <jpql><![CDATA[select c from sample$Car c where c.vin = :vin]]></jpql>
        <params>
            <param name="vin" type="java.lang.String"/>
        </params>
    </query>
    <query name="allColours" entity="sample$Colour" view="_local">
        <jpql><![CDATA[select u from sample$Colour u order by u.name]]></jpql>
    </query>
    <query name="carsByIds" entity="sample$Car" view="carEdit" cacheable="true">
        <jpql><![CDATA[select c from sample$Car c where c.id in :ids]]></jpql>
        <params>
            <param name="ids" type="java.util.UUID[]"/>
        </params>
    </query>
    <query name="myOrders" entity="sample$Order" view="orderBrowse">
        <jpql><![CDATA[select o from sample$Order o where o.createdBy = :session$userLogin]]></jpql>
    </query>
</queries>

关于配置和执行查询语句的示例,可以参考 执行 JPQL 查询(GET)执行 JPQL 查询(POST) 章节。

平台还提供了预定义的 all 查询用来获取指定实体类型的所有实例。这个还能和 /count 一起使用,用来获得实体实例的总数,示例:

http://localhost:8080/app/rest/v2/queries/sales$Order/all/count

XML 里面的 query 元素还可以使用 cacheable 属性来启用查询语句的缓存

查询语句可以包含预定义的参数,这些参数使用当前用户的 id 和登录名:session$userIdsession$userLogin。不需要在 params 元素声明这两个参数(参考上面的例子)。