Невозможно использовать формулу в hibernate (hbm.xml), если в HQL-запросе используется более одной таблицы - PullRequest
0 голосов
/ 14 октября 2019

Я пытался получить количество всех строк, используя формулу, хотя смещение и выборка используются в запросе выбора. Я обнаружил, что count(*) over() даст количество всех строк, как и ожидалось. Если я выполню следующий запрося могу получить точное количество в столбце (totalcount)

Select table.kind,totalCount from table1 as table where "~some condition" OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY.

Запрос sql, напечатанный во время выполнения:

select table_1.type_name,count(*) over() from table_1 table_1 where " condition" OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY

Но если я выполню следующий запрос

select t1.kind,t2.modelName,totalCount from table as t1 join table2 as t2 on t2.id=t1.id where "~some condition" OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY

, возникает следующая ошибка Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.IdentNode-[IDENT] IdentNode: 'totalCount' {originalText=totalCount}

Примечание:

Я использовал перехватчик гибернацииудалить префикс псевдонима, который будет прикреплен к столбцу формулы.

@Override
public String onPrepareStatement(String sql) {
    return super.onPrepareStatement(cleanCountOver(sql));
}

/**
 * Cleans the "{@code count(*) over ()}" query fragment from Hibernate's sql
 * decoration "{@code count(*) <alias>.over ()}".
 */
static String cleanCountOver(String sql) {
    String sqls=sql.replaceAll("(?i) (count)\\(\\*\\) \\w+\\.(over) \\(\\)", " $1(*) $2 () ");
    return sqls;
}

Мои объекты:

<class name="com.model.table1" table="table_1">

    <id name = "id" type = "string" column = "id">
        <generator class="native"/>
    </id>

    <property name="kind" type="int" column="type_name"/>
    <property name="name" type="string" not-null="true" column = "named_param"/>
    <property name="occurenceID" type="string" column="occurrence_id"/>
    <property name="type" type="int"/>
    <property name="totalCount" formula="count(*) over ()" type="int" lazy="true" />
</class>

Второй элемент таблицы:

 <class name="com.model.table2" table="table_2"
        <id name = "id" type = "string" column = "id">
            <generator class="native"/>
        </id>
        <property name="modelName" type="string" column="model_name"/>
        <property name="formId" type="string" column="input_form_id"/>
        <property name="version" type="int" column="version"/>
        <property name="databaseName" type="string" column="database_name"/>

    </class>

Почемуhibernate не может найти столбец формулы, если в запросе используется соединение?

...