@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());//设置为当前时间