Java Data JPA +hibernate 保存或者是查询遇到的坑
由于项目需求,接触了Java Data JPA +hibernate,它的调用方式是controller调用service,service有实现的接口serviceimpl,serviceimpl调用Dao,Dao中用注解@Query写HQL语句(如果要直接写原生的SQL语句@Query中加value="sql语句",nativeQuery=true),要新增或者修改或者是删除时除了加@Query还要加@Modifying注解才能生效。
多表联查用一个vo对象包含你所需要的字段,例如:
@Query("select new com.catsic.casee.yn.law.entity.SfmVo(sfm.dm,sfm.sfmc,sfm.sfjc,sfm.orderid,gsb.dm as odm , gsb.mc as odmmc) from Sfm sfm left join Qxgsbmb gsb on sfm.sfmc = gsb.sfmc where gsb.parentdm like %?1% order by gsb.layer asc")
public List<SfmDto> findSfm_GsbJoin(String parentdm);
SfmVo就是你所需的对象,new时字段名称一一对应,大小写对应。
第二种方法用一个map接受Map<String, Object>就像key-value
@Query(value = "select new map(sfm as sfm ,gsb as gsb ) from Sfm sfm left join Qxgsbmb gsb on sfm.sfmc=gsb.sfmc where gsb.parentdm =:parentdm")
List<Map<String, Object>> findSfm_GsbJoin2(@Param("parentdm") String parentdm);
1.特别遇到的 坑是,新增的实体包含Timestamp类型,对应数据库的Datat类型。新增时hibernate会把Timestamp类型直接保存为Datat类型。
但是如果数据库是Datat类型,你查询后获得的是String类型,就和你接收Vo的Timestamp类型不符合。总报错。这时候你的把接收到的String类型转换为Vo的Timestamp类型,那Vo类就能正常接收了。
2.如果使用nativeQuery=true的SQL语句,返回List<Map<String,Object>>,提示数组越界的话index1 size 1 ,但是SQL语句能正确查询出来,那么可能的form 后表太多,可以再用一个select查询包含所有表试试。