zoukankan      html  css  js  c++  java
  • 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查询包含所有表试试。

  • 相关阅读:
    C#如何为程序打包发布应用(图解教程) (转)
    异步委托与多线程
    如何判断自己的WP7 SDK版本
    (转)c#实现WinRAR解压缩
    网页HTML代码大全
    byte[] ,image, bitmap之间的转换
    MS开发者应懂得知识
    StringFarmat控制字符串居中显示
    WP7模拟器的感应器和GPS模拟定位功能
    lucene.net搜索文档(pdf,doc,txt)内容
  • 原文地址:https://www.cnblogs.com/feipengting/p/10900156.html
Copyright © 2011-2022 走看看