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(...) 相比有啥优势?的主要内容,如果未能解决你的问题,请参考以下文章