SpringBoot2.X之旅,JPA自定义sql查询、多表查询的笔记demo(Web Project)

本文详细介绍如何在SpringBoot项目中使用JPA进行复杂查询,包括自定义SQL语句删除操作及多表联查,提供了具体代码示例与单元测试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是在springboot+druid+jpa基础上实现的。

具体整合请看SpringBoot2.X之旅,JPA+Durid+Mysql实践Druid Monitor笔记demo(Web Project)

一、jpa自定义sql语句查询:

1、在OrderInfoRepository加上方法:

/**
 * 删除某个userId的订单
 * @param userId
 * @return
 */
@Modifying
@Query("DELETE FROM OrderInfo WHERE userId = ?1")
void deleteOrderInfoBy(Integer userId);

2、单元测试:

@Test
@Transactional
public void deleteOrderInfoBy() {

    repository.deleteOrderInfoBy(1);

}

3、执行测试,结果:

4、自定义sql语句时,需要注意的是涉及到数据改动和删除时,需要在接口方法上加@Modifying,同时需要在调用方法上加上事务注解@Transactional,也可以直接加在repository接口方法上。

二、jpa多表查询。

第一种方式,接口接收参数

      1、先定义一个接收参数的接口:

package com.cobra.jpademo.dto;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.math.BigDecimal;

/**
 * @Author: Baron
 * @Description:
 * @Date: Created in 2019/3/10 0:13
 */
public interface OrderDetailDTO {

    Integer getOrderId();

    String getOrderDesc();

    BigDecimal getOrderFee();

    String getUsername();

    String getEmail();

}

      2、在repository(可随意,哪个都行)中,新建接口方法(sql语句里需要用AS指定列别名):

/**
 * 根据userId查询订单详情(包含用户信息)
 * @param userId
 * @return
 */
@Query("SELECT o.orderId AS orderId,o.orderDesc AS orderDesc,o.orderFee " +
            "AS orderFee,u.username AS username,u.email AS email " +
            "FROM OrderInfo o , UserInfo u " +
            "WHERE o.userId=u.userId AND o.userId=?1")
List<OrderDetailDTO> findOrderDetailDTOByUserId(Integer userId);

       3、单元测试:

@Test
public void findOrderDetailDTOByUserId() {

    List<OrderDetailDTO> orderDetails = repository.findOrderDetailDTOByUserId(2);

    for (OrderDetailDTO orderDetail:orderDetails) {
            log.info("orderDetail={}",orderDetail.getOrderId()+
                    orderDetail.getOrderDesc()+orderDetail.getOrderFee()+orderDetail.getUsername());
    }

}

第二种方式:带有全参构造方法的类接收参数

      1、定义一个接收数据的类

package com.cobra.jpademo.dto;

import lombok.Data;

import java.math.BigDecimal;

/**
 * @Author: Baron
 * @Description:
 * @Date: Created in 2019/3/10 0:13
 */
@Data
public class OrderDetailDTO {

    private Integer orderId;

    private String orderDesc;

    private BigDecimal orderFee;

    private String username;

    private String email;

    public OrderDetailDTO() {
    }

    public OrderDetailDTO(Integer orderId, String orderDesc, BigDecimal orderFee, String username, String email) {
        this.orderId = orderId;
        this.orderDesc = orderDesc;
        this.orderFee = orderFee;
        this.username = username;
        this.email = email;
    }

}

      2、在repository(可随意,哪个都行)中,新建接口方法(注意DTO类路径要写上):

/**
* 根据userId查询订单详情(包含用户信息)
* @param userId
* @return
*/
@Query("SELECT new com.cobra.jpademo.dto.OrderDetailDTO(o.orderId,o.orderDesc,o.orderFee,u.username,u.email) " +
"FROM OrderInfo o , UserInfo u " +
"WHERE o.userId=u.userId AND o.userId=?1")
List<OrderDetailDTO> findOrderDetailDTOByUserId(Integer userId);

      3、单元测试:

@Test
public void findOrderDetailDTOByUserId() {

   List<OrderDetailDTO> orderDetails = repository.findOrderDetailDTOByUserId(2);

   log.info("orderDetails={}",orderDetails);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值