JPA多表关联查询

JPA多表映射一般来说有两种方法,旧传统,Hibernate的时候是采用的对象关联的方式,但是那种太out了也太杂乱,还要考虑懒加载这东西。

另外一种是跟mybatis多表关联一样,搞多一个新对象来做映射,达到多表关联的目的。

以下是JPA的一个实操例子,仅供参考

public interface QueueRepository extends JpaRepository<Queue, String>{

    @Query(value="select max(d.balance) as balance,sum(1)  as sums,max(d.balance)*sum(1) as score ,d.device_id as device_id ,d.device_name as device_name \r\n" + 
            "from  queue q \r\n" + 
            "left join device d on q.equipment_id=d.device_id \r\n" + 
            "where d.state=1 and d.`type`=1 \r\n" + 
            "and to_days(q.booking_time) = to_days(now()) \r\n" + 
            "group by d.device_id,d.device_name \r\n" + 
            "order by max(d.balance)*sum(1) asc \r\n" 
            ,nativeQuery=true)
    List<QueueDevice> getQueueByDevice();

    /* 这是我们的加权负载排队算法
    select max(d.balance) as balance,sum(1)  as sums,max(d.balance)*sum(1) as score ,d.device_id as device_id ,d.device_name as device_name 
    from  queue q
    left join device d on q.equipment_id=d.device_id
    where d.state=1 and d.`type`=1
    and to_days(q.booking_time) = to_days(now())
    group by d.device_id,d.device_name
    order by max(d.balance)*sum(1) asc
    ;*/
}

通过代码可以看到,我是把两个表,device设备和queue队列进行关联,从而计算出一个加权队列,再映射到新对象上去,新对象一定要是interface,且有对应参数的构造方法。例如:

  • select user,映射为String getUser();
  • select user_name,映射为String getUser_Name(),注意并不采用驼峰命名的方式。
  • 所以最好返回的时候设置为select username,则可以成功映射为String getUserName();
//命名方式1
public interface QueueDevice {
    String getBalance();
    String getSums();
    String getScore();
    String getDevice_id();
    String getDevice_name();
}
//命名方式2
public interface QueueDevice {
    String getBalance();
    String getSums();
    String getScore();
    String getDeviceId();
    String getDeviceName();
}

接着就可以调用了。

@Service
public class QueueServiceImpl implements QueueService{

    @Autowired
    QueueRepository queueRepository;

    @Override
    public List<QueueDevice> getQueueByDevice() {
        return queueRepository.getQueueByDevice();
    }
}

命名方式1获取出来的对象信息如下:

[{
balance: "12",
device_id: "TC001",
device_name: "骨密度",
score: "12.0",
sums: "1"},
{
balance: "7",
device_Id: "TC002",
device_Name: "氨糖",
score: "14.0",
sums: "2"}
]

命名方式2获取出来的对象信息如下:

[{
        "balance": "12",
        "deviceId": "TC001",
        "deviceName": "骨密度",
        "score": "12.0",
        "sums": "1"
    },
    {
        "balance": "7",
        "deviceId": "TC002",
        "deviceName": "氨糖",
        "score": "14.0",
        "sums": "2"
    }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值