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