【问题标题】:Custom Query from 2 tables and Spring Data JPA来自 2 个表和 Spring Data JPA 的自定义查询
【发布时间】:2020-06-16 21:51:04
【问题描述】:

例外:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [model.pojo.CarPrice]

有两张桌子

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| car_id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| car_brand        | varchar(255) | NO   |     | NULL    |                |
| car_model        | varchar(255) | YES  |     | NULL    |                |
| car_plate_number | varchar(255) | NO   |     | NULL    |                |
| car_type         | varchar(255) | YES  |     | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+

+---------------------+-------------+------+-----+---------+----------------+
| Field               | Type        | Null | Key | Default | Extra          |
+---------------------+-------------+------+-----+---------+----------------+
| car_rent_details_id | int(11)     | NO   | PRI | NULL    | auto_increment |
| cost_per_day        | double      | YES  |     | NULL    |                |
| rent_start_date     | varchar(20) | YES  |     | NULL    |                |
| rent_end_date       | varchar(20) | YES  |     | NULL    |                |
| car_info_id         | int(11)     | NO   | UNI | NULL    |                |
| avaliable_to_rent   | tinyint(1)  | YES  |     | NULL    |                |
+---------------------+-------------+------+-----+---------+----------------+

我试图从 Car 和 CarRentDetails 的一部分中获取全部数据

在我的汽车存储库中

@Repository
public interface CarRepository extends JpaRepository<Car, Integer> {

    String ALL_AVAILIABLE_CAR_LIST_PRICE = " SELECT c.car_id, c.car_brand, c.car_model, 
     c.car_plate_number, c.car_type, crd.cost_per_day, crd.avaliable_to_rent " +
            " FROM car_info c " +
            " JOIN car_rent_details crd" +
            " ON c.car_id = crd.car_rent_details_id" +
            " AND crd.avaliable_to_rent = true ";

    @Query(value = ALL_AVAILIABLE_CAR_LIST_PRICE, nativeQuery = true)
    List<CarPrice> findAllByAvaliablePrice();

尝试将此映射到我的 POJO 类:

public class CarPrice {

    private Integer carId;
    private String carBrand;
    private String carModel;
    private String carPlateNumber;
    private CarType carType;
    private double costPerDay;
    private boolean avaliableToRent;

+ getters, setters, to string 

如何从这个查询映射对象?

【问题讨论】:

    标签: spring spring-data-jpa spring-data spring-data-rest


    【解决方案1】:

    创建投影接口而不是POJO

    public interface CarPrice {
        Integer getCarId();
        String getCarBrand();
        String getCarModel();
        String getCarPlateNumber();
        CarType getCarType();
        double getCostPerDay();
        boolean isAvaliableToRent();
    }
    

    并格式化返回可以适合投影接口getter的字段(带别名的映射)的查询

    String ALL_AVAILIABLE_CAR_LIST_PRICE = " SELECT c.car_id AS carId, c.car_brand AS carBrand, c.car_model AS carModel, 
         c.car_plate_number AS carPlateNumber, c.car_type AS carType, crd.cost_per_day AS costPerDay, crd.avaliable_to_rent AS avaliableToRent" +
                " FROM car_info c " +
                " JOIN car_rent_details crd" +
                " ON c.car_id = crd.car_rent_details_id" +
                " AND crd.avaliable_to_rent = true ";
    
    @Query(value = ALL_AVAILIABLE_CAR_LIST_PRICE, nativeQuery = true)
    List<CarPrice> findAllByAvaliablePrice();
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢,帮了大忙。你知道什么定义了 order whitch 变量是第一位的吗?我的 Json 现在看起来像这样:{ "carPlateNumber": "ZS11110", "carId": 1, "carType": "CLASSIC", "avaliableToRent": true, "carBrand": "VOLVO", "carModel": "V40 ", "costPerDay": 89.0 } 但如果看起来像这样更好:{ car​​Id carBrand carModel carPlateNumber costPerDay avaliableToRent } 第二个 json 反映我的预测界面中的订单。如何重新排列 Json 的订单可能看起来像第二个?
    • 只需在接口CarPrice 上为@JsonPropertyOrder({ "carId", "carBrand", "carModel", "carPlateNumber", "costPerDay", "avaliableToRent" }) 指定json 属性顺序的注释。如果符合您的目的,请将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 2015-03-25
    • 2015-12-07
    • 2012-09-13
    • 1970-01-01
    • 2016-09-30
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多