fas*_*sth 10 java sql hibernate jpa java-ee
乍一看我有一个简单的问题:
entityManager()
.createNativeQuery("select count(*) as total, select sum(field) as total_sum ... blabla") 
我想将选择结果写入POJO,如下所示:
public class AggregateStatsDto {
    private int total;
    private long totalSum;
    // getters, setters, cosntructors
}
实现这一目标的最佳方法是什么?
我可以使用JPA 2.1,并试图使用@SqlResultSetMapping在同一起选择@ConstructorResult:
@SqlResultSetMapping(name = "AggregateStatsResult", classes = {
        @ConstructorResult(targetClass = AggregateStatsDto.class,
                columns = {
                        @ColumnResult(name = "total"),
                        @ColumnResult(name = "totalSum")
                })
})
public class AggregateStatsDto {
        private long total;
        private int totalSum;
        // getters, setters, cosntructors
    }
查询:
AggregateStatsDto result = (AggregateStatsDto) entityManager()
    .createNativeQuery("select count(*) as total, select sum(field) as total_sum ... blabla", "AggregateStatsResult")
    .getSingleResult();
但没有运气.无论如何它似乎想要@Entity.但我只想要一个POJO.
org.hibernate.MappingException: Unknown SqlResultSetMapping [AggregateStatsResult]"
提前致谢!
jef*_*eff 11
将@SqlResultSetMapping批注放在一个实际实体的类中,而不是放在DTO类中.当您在非实体中注释SqlResultSetMapping时,您的实体管理器无法发现您的映射.
@SqlResultSetMapping(name = "AggregateStatsResult", classes = {
    @ConstructorResult(targetClass = AggregateStatsDto.class,
            columns = {
                    @ColumnResult(name = "total"),
                    @ColumnResult(name = "totalSum")
            })
})
@Entity
public class SomeOtherClassWhichIsAnEntity {
我通过以下方式解决了我的问题:这是一个查询:
  final Query query = Sale.entityManager().createNativeQuery(...);
然后我访问了实体管理器内部的Hibernate会话并应用了scalars/resultTransformer.就这样!
 // access to internal Hibernate of EntityManager
        query.unwrap(SQLQuery.class)
                .addScalar("total", LongType.INSTANCE)
                .addScalar("amountOfSales", LongType.INSTANCE)
                .addScalar("amountOfProducts", LongType.INSTANCE)
                .setResultTransformer(Transformers.aliasToBean(SaleStatsInfo.class));
        ...
        query.getSingleResult();
| 归档时间: | 
 | 
| 查看次数: | 25716 次 | 
| 最近记录: |