JPA 2.1 @ConstructorResult 和 @SqlResultSetMapping 与 JPQL SELECT NEW SomeConstructor(...) 相比有啥优势?

Posted

技术标签:

【中文标题】JPA 2.1 @ConstructorResult 和 @SqlResultSetMapping 与 JPQL SELECT NEW SomeConstructor(...) 相比有啥优势?【英文标题】:What advantage has JPA 2.1 @ConstructorResult and @SqlResultSetMapping over JPQL SELECT NEW SomeConstructor(...)?JPA 2.1 @ConstructorResult 和 @SqlResultSetMapping 与 JPQL SELECT NEW SomeConstructor(...) 相比有什么优势? 【发布时间】:2015-08-12 07:21:26 【问题描述】:

我想知道使用@SqlResultSetMapping 和@ConstructorResult 有什么好处?使用 JPQL SELECT NEW SomeConstructor 是否更好,如果,为什么?

例如,这样更好吗:

@Table(name = "person")
@Entity
@SqlResultSetMappings(
    @SqlResultSetMapping(name = "contactLess", 
        classes = @ConstructorResult(columns = 
            @ColumnResult(name = "id", type = Long.class),
            @ColumnResult(name = "full_name", type=String.class)
        , targetClass = Person.class)
    )
)
@NamedNativeQueries(
    @NamedNativeQuery(name = "Person.findWithoutContacts",
                   query = "SELECT c.id, c.full_name FROM person c ",
              resultSetMapping = "contactLess", resultClass = Person.class)
)

比这个(在这种情况下是弹簧数据):

@Query("SELECT NEW Person(c.id, c.fullName) FROM Person c")
public List<Person> findAll();

【问题讨论】:

【参考方案1】:

如果您有多个 JPQL(和/或查询构建器)引用一个实体,那么使用注释将使您的代码更容易重构。 JPQL 也没有编译安全性。

【讨论】:

我同意它使重构变得更容易,但不是 \@SqlResultSetMapping 和 \@ConstructorResult 也不是编译安全的吗?还有其他使用 \@ConstructorResult 的理由吗?它使用原生 sql,当 JPQL 独立于平台时,对吗?

以上是关于JPA 2.1 @ConstructorResult 和 @SqlResultSetMapping 与 JPQL SELECT NEW SomeConstructor(...) 相比有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.1 不生成模式脚本

jpa 2.1中的@ConstructorResult映射

JPA 2.1 - 无法调用 Oracle 函数

jpa 2.1 的生产就绪持久性提供程序

JPA 2.1在sql server中调用存储过程

使用 JPA 2.1 生成元模型类