我有以下内容:
<class name="show"...>
...
<many-to-one name="icon" ... lazy="proxy" fetch="join" not-found="ignore" >
<column name="Icon_ID" not-null="false" />
</many-to-one>
</class>
<class ... table="icon" lazy="true">
...
<id name="id" column="ID" type="long" unsaved-value="-1">
<generator class="identity" />
</id>
</class>
在一种情况下,通过以下命名查询填充图标和显示
<sql-query name="get-shows">
<return alias="ps" class.../>
...
<return-join alias="icon" property="ps.icon">
<return-property name="id" column="ps.Icon_ID2" />
<return-property name="url" column="ps.Icon_Url" />
<return-property name="description" column="ps.Icon_Description" />
...
</sql-query>
就像我看到的许多帖子一样,show 并不总是有一个图标,所以它是一对零或更多的关系。我当然得到一个例外:
org.hibernate.exception.SQLGrammarException:无法在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 的 org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123) 执行查询
原因:java.sql.SQLException:找不到列“Icon_ID3_1_1_”。在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975 ) 在 com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1163) 在 com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java: 3055)在 com.mchange.v2.c3p0.impl.NewProxyResultSet.getLong(NewProxyResultSet.java:2625) 在 org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$2.doExtract(BigIntTypeDescriptor.java:74) 在 org.hibernate。 type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
我不是 Hibernate 专家,但这就是我的理解:由于多对一,Hibernate 想要实例化一个 Icon。但是结果集中的 column_id 为空(因为没有图标)。
问题1:我理解正确吗?
问题 2:我可以使用自定义 Tupolizer / 代理来克服这个问题吗?
我在(2)上花了几个小时,但没有走得很远。问题 3:如果问题 (2) 的答案是肯定的,那么有人可以指点我一个简单的(!)示例,说明如何使用 tuplizer/proxy 解决这个问题。我用谷歌搜索的例子太复杂了(当你用谷歌搜索时,你会无休止地得到那个延迟加载的例子),文档中的例子可能太简单了(?)
PS。问题 4:为什么 not-found="ignore" 在这种情况下不起作用,整个结果集都来自命名查询?或者这实际上是问题所在?
PS 2. 是的,我看过这个:https ://forum.hibernate.org/viewtopic.php?t=949458
谢谢!