这里自定义的实体是没有在数据映射的实体。可以返回聚合函数的值。(个人理解可以。。。。。。)
- 第一种方法
- 实体类。(这里本人使用的是idea)
@Data
public class NameOnlyDto implements Serializable {
private String firstName;
private String lastName;
private String sex ;
}
- repository类(这里不是 使用的继承jpa中的 的方式。而是使用的EntityManager)。代码中有详细的注释。
@Repository public class CustomEntity { // 实体管理器EntityManager是负责管理Entity的对象。对Entity的操作包括添加、删除、修改和查询,都是通过实体管理器来实现的。 @PersistenceContext private EntityManager entityManager; //EntityManagerFactory @Transactional public List<NameOnlyDto> listNameOnlyDto(){ String sql = "select p.last_name lastName, p.first_name firstName from PERSON p"; // hibernate 5.2 之前 // SQLQuery sqlQuery = entityManager.createNativeQuery(sql).unwrap(NativeQueryImpl.class); // hibernate 5.2 之后的 写法 // unwrap 让JPA的Query返回Map对象 javax.persistence.Query.unwrap // hibernate 或jpa 中使用 AliasToBeanResultTransformer 自定义类型转换ResultTransformer 下划线转驼峰 SQLQuery sqlQuery = entityManager.createNativeQuery(sql).unwrap(NativeQueryImpl.class); /*Query query = sqlQuery.setResultTransformer(Transformers.aliasToBean(NameOnlyDto.class)); List<NameOnlyDto> list = query.getResultList();//.list();*/ Query query = sqlQuery.setResultTransformer(Transformers.aliasToBean(NameOnlyDto.class)); List<NameOnlyDto> list =query.getResultList(); entityManager.clear(); return list; } }
OK。就这样就可以了。个人测试似乎在oracle数据库 不行。可能是sql查询结果不太一样
-
第二种方法。可以在特定的场合使用。
自定义类
public class NameOnlyDtoT implements Serializable {
private String firstName;
private String lastName;
// private String address;
private String sex;
//构造函数 特殊注意 这里返回几个字段就要有几个字段的构造参数 感觉不太合适的地方
public NameOnlyDtoT(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
/* public NameOnlyDtoT(String firstName, String lastName, String sex) {
this.firstName = firstName;
this.lastName = lastName;
this.sex = sex;
}*/
}
这里是repository中的写法
// 切记不能使用@query.如果使用@query 个人感觉和上面那种方法是一样的逻辑
List<T> findByLastName(String lastname,Class<T> type);
使用(这里注意的是NameOnlyDtoT 中字段能赋值的只能是person中 含有的字段。这是个人觉得鸡肋的存在)
public List<NameOnlyDtoT> testNameOnlyDtoTS(){
List<NameOnlyDtoT> nameOnlyDtoTS= personRepository.findByLastName("哈哈", NameOnlyDtoT.class);
return nameOnlyDtoTS;
}