3 回答

TA貢獻1891條經驗 獲得超3個贊
這種投影有更好的替代方案,而不是默認的Object[]。
您可以使用 JPAjavax.persistence.Tuple結果集,因為Hibernate ORM 5.2.11適用于本機 SQL:
List<Tuple> postDTOs = entityManager
.createNativeQuery(
"SELECT " +
" p.id AS id, " +
" p.title AS title " +
"FROM Post p " +
"WHERE p.created_on > :fromTimestamp", Tuple.class)
.setParameter( "fromTimestamp", Timestamp.from(
LocalDateTime.of( 2016, 1, 1, 0, 0, 0 )
.toInstant( ZoneOffset.UTC ) ))
.getResultList();
您可以使用 Hibernate-specific ResultTransformer,它允許您構建非常復雜的 DTO 結構(例如圖形):
List postDTOs = entityManager
.createNativeQuery(
"select " +
" p.id as \"id\", " +
" p.title as \"title\" " +
"from Post p " +
"where p.created_on > :fromTimestamp")
.setParameter( "fromTimestamp", Timestamp.from(
LocalDateTime.of( 2016, 1, 1, 0, 0, 0 ).toInstant( ZoneOffset.UTC ) ))
.unwrap( org.hibernate.query.NativeQuery.class )
.setResultTransformer( Transformers.aliasToBean( PostDTO.class ) )
.getResultList();
您還可以使用命名的本機查詢:
List<PostDTO> postDTOs = entityManager
.createNamedQuery("PostDTO")
.setParameter( "fromTimestamp", Timestamp.from(
LocalDateTime.of( 2016, 1, 1, 0, 0, 0 )
.toInstant( ZoneOffset.UTC ) ))
.getResultList();
其中PostDTO查詢是一個命名的本機 SQL 查詢,如下所示:
@NamedNativeQuery(
name = "PostDTO",
query =
"SELECT " +
" p.id AS id, " +
" p.title AS title " +
"FROM Post p " +
"WHERE p.created_on > :fromTimestamp",
resultSetMapping = "PostDTO"
)
@SqlResultSetMapping(
name = "PostDTO",
classes = @ConstructorResult(
targetClass = PostDTO.class,
columns = {
@ColumnResult(name = "id"),
@ColumnResult(name = "title")
}
)
)
酷,對吧?

TA貢獻1856條經驗 獲得超17個贊
只需通過調用創建它
createNativeQuery("SELECT a.a, a.b, a.c FROM aTable");
它將默認返回一行Object[]
.
該警告與您的情況無關,因此只需將其壓制即可。
添加回答
舉報