我正在将ETL流程从工具转换为Java批处理API应用程序。在此ETL过程中。在当前版本中(使用该工具),我们有许多SQL语句连接不同的表以生成所需的输出。现在可以将JPA转换为Java。
我想使用本机查询。这样做会很不错,因为它不需要为查询中使用的每个表创建实体,并且我可以将POJO用于查询的结果(而且,我不需要重写查询)。我知道我可以使用@SqlResultSetMapping。问题是我的项目中没有任何实体,因此我不知道将该注释放在何处。我可以在任何地方放置此注释,以便实体管理器找到它吗?
@SqlResultSetMapping
PS:在概念验证中,我目前正在手动将对象数组转换为POJO,但是我真的不喜欢这种方法。
将@Entity注释添加到POJO将导致我的应用程序无法启动:
@Entity
原因:org.hibernate.HibernateException:缺少表:MyTable
我不确定(现在正在搜索),但是我认为它可能是由我的persistence.xml中的此属性引起的
<property name="hibernate.hbm2ddl.auto" value="validate"/>
实际上,我找到了想要的答案:
我可以@SqlResultSetMapping在orm.xml中使用XML 来定义的行为,因此可以使用以下定义:
@SqlResultSetMapping( name = "BookValueMapping", classes = @ConstructorResult( targetClass = BookValue.class, columns = { @ColumnResult(name = "id", type = Long.class), @ColumnResult(name = "title"), @ColumnResult(name = "version", type = Long.class), @ColumnResult(name = "authorName")}))
将在XML中定义如下:
<sql-result-set-mapping name="BookValueMappingXml"> <constructor-result target-class="org.thoughts.on.java.jpa.value.BookValue"> <column name="id" class="java.lang.Long"/> <column name="title"/> <column name="version" class="java.lang.Long"/> <column name="authorName"/> </constructor-result> </sql-result-set-mapping>
让我无需实体即可进行定义。