Я хочу сделать собственную скалярную проекцию в спящем режиме (с Tuple.class), используя как UUID, так и тип Range из hibernate-types-52 (@Vlad Mihalcea).
Я использую:
- пружинная загрузка (v2.2.6.RELEASE)
- hibernate (v5.4.12.Final)
- hibernate -types-52 (v2.9.7)
- postgres (v11)
Я объявил пользовательский PostgreSQL диалект
class CustomPostgreSQLDialect : PostgreSQL10Dialect() {
init {
this.registerColumnType(Types.BLOB, "bytea");
this.registerHibernateType(Types.OTHER, PostgresUUIDType::class.java.name)
//this.registerHibernateType(Types.OTHER, PostgreSQLRangeType::class.java.name)
}
override fun remapSqlTypeDescriptor(sqlTypeDescriptor: SqlTypeDescriptor): SqlTypeDescriptor {
return if (sqlTypeDescriptor.sqlType == Types.BLOB) {
BinaryTypeDescriptor.INSTANCE
} else super.remapSqlTypeDescriptor(sqlTypeDescriptor)
}
}
Когда следующая строка - комментарий
this.registerHibernateType(Types.OTHER, PostgreSQLRangeType::class.java.name)
Работает нормально, если и только если я приведу столбец диапазона.
val statement = "SELECT uuidColumn, CAST(rangeColumn as TEXT) FROM ...."
entityManager.createNativeQuery(statement, Tuple::class.java)
Если я прав, я могу объявить только одно сопоставление для java. sql .Types.OTHER, если я объявляю multi one, используется последний. В самом деле, если оба являются uncomment, у меня есть ClassCastException для UUID не может быть приведен к PGObject.
Есть ли способ сделать собственную скалярную проекцию (используя Tuple.class) с типами UUID и Range без необходимости приведения того или иного типа? Наконец, я хотел бы написать свой запрос следующим образом:
val statement = "SELECT uuidColumn, rangeColumn FROM ...."
entityManager.createNativeQuery(statement, Tuple::class.java)
Мне известны следующие опции
@SqlResultSetMapping(
name="ProjectioName",
columns=[
ColumnResult(name="uuidColumn", type = PostgresUUIDType::class),
ColumnResult(name="rangeColumn", type = PostgreSQLRangeType::class)
]
)
entityManager.createNativeQuery(statement, "ProjectioName")
Проблема в том, что я не хочу объявлять 'SqlResultSetMapping' для всех мои прогнозы с UUID и другим конкретным c столбцом (JSON, Range, ...)
или
entityManager.createNativeQuery(statement, Tuple::class.java)
.unwrap(NativeQuery::class.java)
.addScalar("uuidColumn", PostgresUUIDType.INSTANCE)
.addScalar("rangeColumn", PostgreSQLRangeType.INSTANCE)
Эта опция может быть хорошо, но у меня много столбцов, если я начинаю добавлять «.addScalar (...)», мне нужно определить все столбцы. В идеале, я хотел бы использовать «.addScalar (...)» для некоторых определенных c столбцов и отступить к «стратегии» по умолчанию для тех, кого я не объявляю, возможно?
РЕДАКТИРОВАТЬ
Что-то, что я не упомянул как обязательное, - это моя потребность сделать собственный запрос, из-за некоторых (много) запросов, использующих CTE или Windows Функция или Рекурсивный запрос или спецификация c Postgres операторов .... Criteria API нельзя использовать для собственных запросов, верно?
Возможно использовать .addScalar (...) для некоторых определенных c столбцов (UUID, Range , JSON, ...) и другие столбцы в запросе не объявляются с помощью .addScalar () откат до разрешения по умолчанию?
Я хочу лучшее из двух миров, может быть, это утопия, но быть в состоянии указать только тип с ".addScalar" для некоторых столбцов, а другие продолжают работать как без ".addScalar" было бы здорово.