Jpql Query. Объединение таблиц

Добрый день!

Подскажите, пожалуйста, когда я создаю jpql query таким образом:
image
то в результате идет объединение таблиц так, как будто условие where s = e.stock
напрочь отсутствует в запросе.
Когда я создаю jpql query таким образом:
image
Тогда запрос выполняется корректно.

Подскажите, пожалуйста, что я делаю не так с первым вариантом запроса? И как быть, если есть потребность делать сложные jpql запросы?

Подскажите, пожалуйста, когда я создаю jpql query таким образом:

                <query>
                    <![CDATA[select e from orderstore_StockMovement e, orderstore_Stock s where s = e.stock]]>
                    <condition>
                        <and>
                            <c:jpql>
                                <c:where>s.owner = :owner</c:where>
                            </c:jpql>
                        </and>
                    </condition>
                </query>

то в результате идет объединение таблиц так, как будто условие where s = e.stock
напрочь отсутствует в запросе.
Когда я создаю jpql query таким образом:

                <query>
                    <![CDATA[select e from orderstore_StockMovement e]]>
                    <condition>
                        <and>
                            <c:jpql>
                                <c:where>e.stock.owner = :owner</c:where>
                            </c:jpql>
                        </and>
                    </condition>
                </query>

Тогда запрос выполняется корректно.

Подскажите, пожалуйста, что я делаю не так с первым вариантом запроса? И как быть, если есть потребность делать сложные jpql запросы?

Здравствуйте,
В первую очередь попробуйте посмотреть SQL запросы, которые генерируются из JPQL. Для этого необходимо включить логирование SQL запросов: подробности можно найти по ссылке XML. Параметр or в фильтрах datasource

Добрый день!
Спасибо за ответ.

В логах фиксируется такая информация:

2020-07-07 20:55:15.893 DEBUG [http-nio-8081-exec-5/app-core/admin] com.haulmont.cuba.core.app.RdbmsStore - loadList: metaClass=orderstore_StockMovement, view=com.sweethill.orderstore.entity.StockMovement/stockMovement-view, query=Query{queryString=‘select e from orderstore_StockMovement e, orderstore_Stock s where s = e.stock’, condition=([where: s.owner = :owner]), sort=null, firstResult=0, maxResults=50}, max=50
2020-07-07 20:55:15.924 DEBUG [http-nio-8081-exec-5/app-core/admin] eclipselink.sql - <t 1395553451, conn 581693914> SELECT t1.ID AS a1, t1.CREATE_TIME AS a2, t1.DATE_FACT AS a3, t1.NUM AS a4, t1.INCOME AS a5, t1.NOTES AS a6, t1.PRIORITY AS a7, t1.VERSION AS a8, t1.STOCK_ID AS a9, t0.ID AS a10, t0.DEF AS a11, t0.NAME AS a12, t0.VERSION AS a13 FROM ORDERSTORE_STOCK t0, ORDERSTORE_STOCK t2, ORDERSTORE_STOCK_MOVEMENT t1 WHERE ((t0.ID = t1.STOCK_ID) AND (t0.OWNER_ID = ?)) LIMIT ? OFFSET ?
bind => [56c464f3-e2c2-dc9f-8a79-76f2d4274378, 50, 0]
2020-07-07 20:55:15.930 DEBUG [http-nio-8081-exec-5/app-core/admin] eclipselink.sql - <t 1395553451, conn 581693914> [6 ms] spent

Зачем-то в запрос ошибочно добавлена еще одна таблица ORDERSTORE_STOCK t2

app.log (1.1 КБ)

Эта связка есть в получаемом представлении?

Да, есть:

    <view entity="orderstore_StockMovement" name="stockMovement-view" extends="_local">
        <property name="stock" view="_minimal">
            <property name="def"/>
        </property>
        <property name="records" view="_minimal">
            <property name="stockMovement" view="_minimal"/>
            <property name="note"/>
            <property name="good" view="_minimal">
                <property name="code"/>
            </property>
            <property name="price"/>
            <property name="quantity"/>
            <property name="total"/>
        </property>
    </view>

Странная таблица в запросе, возможно ошибка построения запроса EclipseLink.
Попробуйте переписать запрос с использованием конструкции JOIN:

select e from orderstore_StockMovement e join orderstore_Stock s on s = e.stock

Не помогло.
Ошибка сохранилась. Debug запросов см. app.log

app.log (970 Байт)

Здравствуйте,
Не получается воспроизвести проблему, в запрос корректно добавляются все условия по JOIN по таблице STOCK.
Предлагаю вам еще попробовать упрощать view и посмотреть когда запрос SQL станет корректным.
Не могли бы вы приложить тестовый проект воспроизводящий ошибку.

Примеры корректных преобразований тестовом проекте (когда пытался воспроизвести проблему):
JPQL:

select e from testquery_StockMovement e, testquery_Stock s where e.stock = s

SQL:

SELECT LIMIT ? ? t1.ID AS a1, t1.DELETE_TS AS a2, t1.DELETED_BY AS a3, t1.NAME AS a4, t1.VERSION AS a5, t1.STOCK_ID AS a6, t0.ID AS a7, t0.DELETE_TS AS a8, t0.DELETED_BY AS a9, t0.VERSION AS a10 FROM TESTQUERY_STOCK t0, TESTQUERY_STOCK t2, TESTQUERY_STOCK_MOVEMENT t1 WHERE (((t1.STOCK_ID = t2.ID) AND (t1.DELETE_TS IS NULL)) AND ((t2.DELETE_TS IS NULL) AND ((t0.ID = t1.STOCK_ID) AND (t0.DELETE_TS IS NULL))))
    bind => [0, 50]

Добрый день!

Спасибо за ответ.

Если из объявления представления убрать выделенный жирным (звездочками) текст, тогда ошибку уходит.
Мне сложно понять, как представление может быть связано с jpql запросом по базе данных.

        **<property name="stock" view="_minimal">**
**            <property name="def"/>**
**        </property>**
        <property name="records" view="_minimal">
            <property name="stockMovement" view="_minimal"/>
            <property name="note"/>
            <property name="good" view="_minimal">
                <property name="code"/>
            </property>
            <property name="price"/>
            <property name="quantity"/>
            <property name="total"/>
        </property>
    </view>

Если вы сможете приложите тестовый проект который воспроизводит ошибку - то мы можем попробовать проанализировать и возможно решить.