У меня была похожая проблема, когда я не мог изменить тип Java или тип базы данных.В моей ситуации мне нужно было выполнить собственный запрос SQL (чтобы иметь возможность использовать возможности рекурсивного запроса Oracle) и сопоставить результирующий набор с неуправляемой сущностью (по сути, простым классом pojo).
Я нашелкомбинация addScalar и setResultTransformer сотворенных чудес.
hibernateSes.createSQLQuery("SELECT \n"
+ " c.notify_state_id as \"notifyStateId\", \n"
+ " c.parent_id as \"parentId\",\n"
+ " c.source_table as \"sourceTbl\", \n"
+ " c.source_id as \"sourceId\", \n"
+ " c.msg_type as \"msgType\", \n"
+ " c.last_updt_dtm as \"lastUpdatedDateAndTime\"\n"
+ " FROM my_state c\n"
+ "LEFT JOIN my_state p ON p.notify_state_id = c.parent_id\n"
+ "START WITH c.notify_state_id = :stateId\n"
+ "CONNECT BY PRIOR c.notify_state_id = c.parent_id")
.addScalar("notifyStateId", Hibernate.LONG)
.addScalar("parentId", Hibernate.LONG)
.addScalar("sourceTbl",Hibernate.STRING)
.addScalar("sourceId",Hibernate.STRING)
.addScalar("msgType",Hibernate.STRING)
.addScalar("lastUpdatedDateAndTime", Hibernate.DATE)
.setParameter("stateId", notifyStateId)
.setResultTransformer(Transformers.aliasToBean(MyState.class))
.list();
Где notifyStateId
, parentId
, sourceTbl
, sourceId
, msgType
,и lastUpdatedDateAndTime
- все свойства MyState
.
Без addScalar
я получил бы java.lang.IllegalArgumentException: argument type mismatch
, потому что Hibernate превращал тип Oracle Number
в BigDecimal
, но notifyStateId
и parentId
являются Long
типами на MyState
.