一尘不染

当我的项目中没有任何实体时,如何将本机查询映射到POJO?

hibernate

我正在将ETL流程从工具转换为Java批处理API应用程序。在此ETL过程中。在当前版本中(使用该工具),我们有许多SQL语句连接不同的表以生成所需的输出。现在可以将JPA转换为Java。

我想使用本机查询。这样做会很不错,因为它不需要为查询中使用的每个表创建实体,并且我可以将POJO用于​​查询的结果(而且,我不需要重写查询)。我知道我可以使用@SqlResultSetMapping。问题是我的项目中没有任何实体,因此我不知道将该注释放在何处。我可以在任何地方放置此注释,以便实体管理器找到它吗?

PS:在概念验证中,我目前正在手动将对象数组转换为POJO,但是我真的不喜欢这种方法。

@Entity注释添加到POJO将导致我的应用程序无法启动:

原因:org.hibernate.HibernateException:缺少表:MyTable

我不确定(现在正在搜索),但是我认为它可能是由我的persistence.xml中的此属性引起的

<property name="hibernate.hbm2ddl.auto" value="validate"/>

阅读 234

收藏
2020-06-20

共1个答案

一尘不染

实际上,我找到了想要答案

我可以@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>

让我无需实体即可进行定义。

2020-06-20