Я пытался получить количество всех строк, используя формулу, хотя смещение и выборка используются в запросе выбора. Я обнаружил, что 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 не может найти столбец формулы, если в запросе используется соединение?