JPA返回自定义VO
最近做项目用到了JPA,很多地方需要返回自定义vo,最开始用@Query注解返回自定义List<Objec[]>,在用forEach遍历存入List
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);
}