SpringBoot JPA的坑

 

 

@Query()自定义语句

可以使用这个注解进行自定义语句的使用,适用于增删改查,和多表查询

//根据停车场id查看停车记录
@Query(value = "select * from parkRecord where carParkId=?1",nativeQuery = true)
List<ParkRecord> findByCarParkId(Integer carParkId);

@Query()中的多表查询

在进行前后端分离的过程中,经常需要从后端查询出来的数据选出前端需要数据进行返回,

这时候就需要使用VO类来存放前端需要的数据

注意要点
一、在开始查询时,就需要将SQL语句设为JPQL查询,也就是非原生查询,
二、并且在语句中new出这个VO类,将所有字段名罗列在其中,
三、并且对应上VO类中的构造方法,就是说有构造方法有几个VO类的参数,就要写几个,
四、在from后面的实体名必须加别名,才能让字段名罗列出来,
五、有些类型是不被支持的,比如Timestamp就不能,需要用java.util.Date来取代
六、语句中的实体名和实体的字段名都不能写错,都要对应上实体类,否则会报错

例子:
//VO类
@Data
@AllArgsConstructor
public class ParkRecordVO {
	private Integer parkRecordId;
	private Integer carParkId;//停车场id
	private Integer licensePlateId;//车牌id
	@JSONField(format = "yyyy-MM-dd HH:mm:ss")
	private Date startTime;
	@JSONField(format = "yyyy-MM-dd HH:mm:ss")
	private Date endTime;

	private Integer parkRecordOrderId;
	private Double originalPrice;//原价
	private Double realPrice;//实际价格

	private String name;
	private String address;
}

//语句
//查看停车记录:根据用户id
@Query(value = "
select new com.example.carpark.vo.ParkRecordVO
(p.parkRecordId,p.carParkId,p.licensePlateId,p.startTime,p.endTime,o.parkRecordOrderId,o.originalPrice,o.realPrice,c.name,c.address) 
from ParkRecord p,CarPark c,ParkRecordOrder o,LicensePlate l 
where l.licensePlateId=p.licensePlateId and l.userId=?1 and c.carParkId=p.carParkId and o.parkRecordId=p.parkRecordId")
List<ParkRecordVO> findByUserId(Integer userId);






 

@Query()中的nativeQuery

该注解是是否成为原生sql语句,true代表执行原生sql语句,false代表执行JPQL语句,默认为false;

JPQL与原生sql的区别就是,原生sql中的表名在JPQL中必须是实体名,不能是数据表真正的表名,

并且sql中的字段名也不是数据库中真正的字段名,而是实体的字段名。

@Query(value = "select * from licensePlate where isFinish=0", nativeQuery = true)
List<LicensePlate> findNotFinish();//查询未完成的数据

 

@Modifying

加了这个注解才能执行自定义的更新和删除操作,否则会报错

//拒绝通过车牌审核
@Modifying//需要加这个注解才知道是修改或者更新操作
@Transactional
@Query(value = "update licensePlate set isFinish=0 , adminId=?2 , reason=?3 where licensePlateId=?1 ",nativeQuery = true)
Integer error(Integer licensePlateId,Integer adminId,String reason);

设置默认值

最简单的方式是在实体类中对字段名直接设置值

private Integer number = 0;//设置默认为0
private Timestamp registerTime = new Timestamp(new Date().getTime());//设置为当前时间

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值