Hibernate ClassCastException [MyBean] несовместимо с java.util.Map

#java #hibernate #jpa

Вопрос:

Я уже делал это раньше. Я даже делаю это в других местах в том же приложении. Спящий режим 5.2 — это моя версия. AssetInfo-это простой компонент, всего 4 столбца. Все свойства имеют get/set. Конструктор Null. Запрос, похоже, компилируется. Я дважды проверил, что все возвращаемые столбцы имеют псевдонимы, соответствующие именам свойств компонента. Никаких аннотаций к AssetInfo, это просто компонент.

Должно быть, я что-то упускаю. Должно быть, в этом что-то другое по сравнению с другими местами в том же приложении, в котором я это делаю, но я этого не вижу. Кажется, он умирает после запроса во время подготовки результатов для меня.

Исключение:

 java.lang.ClassCastException: [mypackage].AssetInfo incompatible with java.util.Map at org.hibernate.property.access.internal.PropertyAccessMapImpl$SetterImpl.set(PropertyAccessMapImpl.java:102) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:78) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.hql.internal.HolderInstantiator.instantiate(HolderInstantiator.java:85) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:430) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2507) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.loader.Loader.list(Loader.java:2502) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:335) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2161) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1016) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:152) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]  

Этот звонок:

 Querylt;AssetInfogt; query = session.createNativeQuery(sql.toString()).setResultTransformer(Transformers.aliasToBean(AssetInfo.class));  buildParmList(query, searchCriteria);  Listlt;AssetInfogt; result = query.list();  

Запрос (как вышел из системы с помощью hibernate — показывает, что он скомпилировал и запустил его):

 select asset_id as assetId, [redacted] as caseNumber, asset_desc as assetDescription, asset_val as assetValue from [redacted] where [redacted]= ? and ASSET_ID like '21-%' order by asset_id fetch first 100 rows only  

Фасоль:

 private String assetId; private String assetDescription; private BigDecimal assetValue; private String caseNumber;  public AssetInfo() {  super(); }  public String getCaseNumber() {  return caseNumber; } public void setCaseNumber(String caseNumber) {  this.caseNumber = caseNumber; } public BigDecimal getAssetValue() {  return assetValue; } public void setAssetValue(BigDecimal assetValue) {  this.assetValue = assetValue; } public String getAssetId() {   return assetId; } public void setAssetId(String assetId) {  this.assetId = assetId; } public String getAssetDescription() {  return assetDescription; } public void setAssetDescription(String assetDescription) {  this.assetDescription = assetDescription; }  

Ответ №1:

Оказывается, db2 заполняет столбцы в верхнем регистре, если я не заключу псевдонимы в кавычки. Я почему-то никогда не сталкивался с этой проблемой. Но да, просто используйте кавычки вокруг псевдонимов. ИМХО, спящий режим должен давать лучшую ошибку в этом вопросе, но теперь я знаю.