zoukankan      html  css  js  c++  java
  • springdata jpa多表查询的方式

    方式一:使用@Query注解方式查询主要有JPQL方式,也就是面向对象的方式,这种情况下查表其实查的是对象,字段是实体中的属性,该方式可以直接映射到实体,如下图。

    使用jpql的方式模糊查询时候不能使用if(?3 != '', e.originalIp like %?3%, 1=1)判断空值,所以只能使用原生sql写法。

    坑点一:如果实体中包含timestamp类型是无法映射成功的,会报异常不能分配给构造,这个很坑很坑,找了一天的问题,解决方式将timestamp类型改为java.util包下的Date类型即可。

    方式二: 使用@Query注解方式查询也可以用原生sql的方式,该方式和我们在数据库写sql是一样的,对应的是表名,字段,该方式不能直接映射到实体,使用该方式只需要在注解中加入nativeQuery = true即可。

    使用该方式可以使用if(?3 != '', e.originalIp like %?3%, 1=1)判断空值,但是不能直接映射到DTO,实现方式推荐使用实体定义成接口形式,只需要有get方法即可,注意命名要规范(JPA生成了该接口的代理类,支持直接序列化为json串),如下图,该方式可以用HQL查询,也可以用原生SQL查询,LEnvfilehistoryDto2是一个接口,这里返回的是JPA生成的YyyDto的代理类。

    坑点二:属性一定要跟sql中字段对应好,如果字段中有_,结果不会自动驼峰映射,所以必须使用as起别名,避免下划线。

    坑点三:模糊查询时候使用if(?1!='',h.final_state = ?1,1=1)判断空值,如果参数是integer类型,如果前台传0,则对应sql为if(0!='',h.final_state = 0,1=1),这个时候查询并不会按等于0去匹配,而是查询所有,解决方案为将integer类型转换为string类型传入比较,即if('0'!='',h.final_state = '0',1=1)即可。

    springdata jpa重要知识点

    (1)可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。 注意: JPQL 不支持使用 INSERT; 
    (2)在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作 
    (3)UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作; 
    (4)默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务。 他们不能完成修改操作。

  • 相关阅读:
    zoj 2316 Matrix Multiplication 解题报告
    BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告
    codeforces 463C. Gargari and Bishops 解题报告
    codeforces 463B Caisa and Pylons 解题报告
    codeforces 463A Caisa and Sugar 解题报告
    CSS3新的字体尺寸单位rem
    CSS中文字体对照表
    引用外部CSS的link和import方式的分析与比较
    CSS样式表引用方式
    10个CSS简写/优化技巧
  • 原文地址:https://www.cnblogs.com/coderxiaobai/p/14335328.html
Copyright © 2011-2022 走看看