当前位置:   article > 正文

JPA学习整理,包括一对多,多对多的处理方法_jpa多对多update

jpa多对多update

JPA学习整理,包括一对多,多对多的处理方法


最近突然用到JPA的功能,之前没有接触过,在这里单纯整理和分享,只是自己的处理方法和思路

实体类注解

1.@Data 单纯理解是代替了get和set,写此代码可以不用再类中写get、set方法了,需要引入lombok
2.@ApiModel 是可在Swagger页面显示的注解
3.@SQLDelete(sql = “update demo set isDelete = 1 where id = ?”) 在执行JPA的删除操作时,可根据后边的内容来确定每次删除时默认的条件,这里可以理解当传如id后,每次都将isDelete的字段改为1
4.@Where(clause = “isDelete = 0”) 每次Select时,都将默认加上isDelete=0这个条件
5.@DynamicInsert @DynamicUpdate 生成的SQL就会只输出SET有变化的字段


@Data
@Entity
@Table(name = "demo")
@ApiModel(value = "demo 对象")
@SQLDelete(sql = "update demo set isDelete = 1 where id = ?")
@Where(clause = "isDelete = 0")
@DynamicInsert
@DynamicUpdate
@Accessors(chain = true)
public class Demo  implements Serializable {
	@Id
	@GeneratedValue(generator = "system-uuid")
	@GenericGenerator(name = "system-uuid", strategy = "uuid")
	@ApiModelProperty(value = "主键", name = "id", hidden = true)
	private String id;

	@ApiModelProperty(value = "姓名", name = "userName", required = false)
	@Column
	private String userName;

	@ApiModelProperty(value = "年龄", name = "userAge", required = false)
	private String userAge;

	@ApiModelProperty(value = "性别", name = "userSex", required = false)
	private String userSex;

	@ApiModelProperty(value = "删除", name = "isDelete", required = false)
	private Integer isDelete;

	@ApiModelProperty(value = "时间", name = "createTime", required = false)
	private String createTime;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

DAO

@Modifying在update中使用


@Repository
public interface DemoDao extends JpaRepository<Demo, String>  {
    @Modifying
    @Query("update Demo set userName = :userName, userAge = :userAge,userSex= :userSex where id = :id")
    Integer updateById(@Param("id") String id, @Param("userName") String userName, 

    @Query(value="SELECT d.id,d.userName,d.userAge,d.userSex,IFNULL(u.uphone,'') as uphone from demo d LEFT JOIN user_table u ON d.userName=u.uname WHERE if(:#{#demo.userName} !='',d.userName=:#{#demo.userName},1=1) ",//d.userName=:#{#demo.userName}
            countQuery = "SELECT count(*) FROM demo d left join  user_table u ON d.userName=u.uname WHERE if(:#{#demo.userName} !='',d.userName=:#{#demo.userName},1=1)",nativeQuery=true)
    Page<Map> findManyTable(@Param("demo") Demo demo, Pageable pageable);


    @Query(value="SELECT new com.sncy.evaluateservice.entity.DemoUserMap(d,u) from Demo d LEFT JOIN UserTable u ON d.userName=u.uname WHERE d.userName=:#{#demo.userName}")
    Page<DemoUserMap> findManyTableHQL(@Param("demo") Demo demo, Pageable pageable);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

DAO层集成JpaRepository<Demo, String>后,泛型中的Demo是原本的实体类
1.单表 Demo查询的话,可以直接用findAll或者findOne来执行
2.多表对多表的情况,可以根据findManyTable方法,编写原生SQL来进行业务操作,这里返回的是Page,可根据自身情况做调整,如果不需要JPA的的分页,可以直接用List来接返回值
3.一对多或者多对一的情况,可以根据findManyTableHQL使用HQL来实现业务流程,这里需要注意:

SELECT new com.sncy.evaluateservice.entity.DemoUserMap(d,u) from Demo d LEFT JOIN UserTable u ON d.userName=u.uname WHERE d.userName=:#{#demo.userName}")

HQL中 所有的表名均是类名,不是数据库表名,返回值DemoUserMap是需要单独生成一个实体类,包含需要查询两个表的实体类,可看下图二
在这里插入图片描述
图2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/974894
推荐阅读
相关标签
  

闽ICP备14008679号