JPA返回自定义Vo

JPA返回自定义VO

最近做项目用到了JPA,很多地方需要返回自定义vo,最开始用@Query注解返回自定义List<Objec[]>,在用forEach遍历存入List实在是不方便,找了一些资料做下笔记。
一般需要返回自定VO都是做连表动态查询,下面直接贴测试代码

User(Entity)

@Data
@Entity
@Table(name = "jpa_user")
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name ="name")
    private String name;

    @Column(name ="age")
    private Integer age;

    @Column(name ="sex")
    private String sex;

    @Column(name ="card")
    private String card;

    @Column(name ="children")
    private Boolean children;

}

UserRespDto(自定义VO)

@Data
public class UserRespDto implements Serializable {

    private String myname;
    private String mycard;
}

JPA接口不说了,继承JpaRepository和JpaSpecificationExecutor就行

测试

    /**
     * 返回Entity对象,要求是数据库中字段全部查询 即findAll或者理解为select *
     */
    @Test
    public void t2() {
        StringBuilder sb = new StringBuilder();
        sb.append("select * from jpa_user where 1=1 ");
        //自行根据条件动态拼接,仅做演示
        sb.append("  and name like '%李%' ");
        Query nativeQueryPo = entityManager.createNativeQuery(sb.toString(), User.class);
        List resultList = nativeQueryPo.getResultList();
        System.out.println(resultList);
    }

    /**
     * 返回自定义VO对象,要求是查询别名必须和VO中属性名一致
     */
    @Test
    //注意,很重要,事务必须开启,不开启会报错提示无法转化,具体原因和动态代理有关系
    @Transactional(readOnly = true)
    public void t3() {
        StringBuilder sb = new StringBuilder();
        sb.append("select name myname,card mycard from jpa_user where 1=1 ");
        //自行根据条件动态拼接,仅做演示
        sb.append("  and name like '%李%' ");
        Query nativeQuery = entityManager.createNativeQuery(sb.toString());
        List list = nativeQuery.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(UserRespDto.class)).list();
        System.out.println(list);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值