Как перевести этот SQL-запрос в JPA - PullRequest
0 голосов
/ 29 сентября 2018

Доброе утро, у меня вопрос к этому.У меня есть SQL-запрос, который включает в себя 3 таблицы: кредиты, платежи и счета

выберите c.date, c.pay_number, c.cost из кредитов c присоединиться к платежу p на c.payment_id = p.id объединить счет bна b.id = p.bill_id где b.id =: b.id;

Когда я помещаю этот запрос в dbeaver, он отлично работает, но мне нужна помощь, чтобы перевести на правильное предложение JPA.

Это объект счета:

@Entity
@Data
public class Bill {

    @Id
    @GeneratedValue
    private UUID id;
    private long dateCreated;
    private boolean active;
    private String billSeq;
    private String stringSeq;
    private String priceType;
    private double iva;
    private double ice;
    private double total;
    private double subTotal;
    private double baseNoTaxes;
    private double baseTaxes;
    private String ordenDecompra;
    private String srr;
    private String lugar;
    private String otir;
    private double discount;
    private int discountPercentage;
    private String claveDeAcceso;
    private String idSri;
    private int typeDocument;
    private String quotationSeq;
    private String stringQuotationSeq;

    @ManyToOne
    @JoinColumn(name = "client_id")
    private Client client;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private UserIntegridad userIntegridad;

    @ManyToOne
    @JoinColumn(name = "subsidiary_id")
    private Subsidiary subsidiary;

    @OneToMany(mappedBy = "bill", cascade = CascadeType.ALL)
    private List<Detail> details;

    @OneToMany(mappedBy = "bill", cascade = CascadeType.ALL)
    private List<Payment> payment;

    public void setListsNull(){
        details = null;
        payment = null;
    };

    public void setFatherListToNull(){
        client.setListsNull();
        client.setFatherListToNull();
        userIntegridad.setListsNull();
        userIntegridad.setFatherListToNull();
        subsidiary.setListsNull();
        subsidiary.setFatherListToNull();
    };

    @Transient
    public static Bill newBillTest(){
        Bill bill = new Bill();
        bill.setDetails(new ArrayList<>());
        bill.setPagos(new ArrayList<>());
        bill.setClient(Client.newClientTest());
        bill.setUserIntegridad(UserIntegridad.newUserIntegridadTest());
        bill.setSubsidiary(Subsidiary.newSubsidiaryTest());
        return bill;
    };
}

Это объект платежа:

@Entity
@Data
public class Payment implements Child {

    @Id
    @GeneratedValue
    private UUID id;
    private String medio;
    private double total;
    private String payForm;
    private String cardBrand;
    private String chequeAccount;
    private String chequeBank;
    private String chequeNumber;
    private String chequeDiasPlazo;
    private long fechaCobro;
    private int creditoIntervalos;
    private int creditoNumeroPagos;

    @OneToMany(mappedBy = "payment", cascade = CascadeType.ALL)
    private List<Credits> credits;

    @ManyToOne
    @JoinColumn(name = "bill_id")
    private Bill bill;

    public void setListsNull(){
        credits = null;
    }

    public void setFatherListToNull(){
        bill.setListsNull();
        bill.setFatherListToNull();
    }

    public static Payment newPaymentTest(){
        Payment payment = new Payment();
        payment.setBill(Bill.newBillTest());
        return payment;
    }
}

Это объект кредитов:

@Entity
@Data
public class Credits implements Child {
    @Id
    @GeneratedValue
    private UUID id;
    private int diasPlazo;
    private long fecha;
    private int payNumber;
    private double valor;

    @ManyToOne
    @JoinColumn(name = "payment_id")
    private Payment payment;

    public void setFatherListToNull(){
        payment.setListsNull();
        payment.setFatherListToNull();
    }

    public static Credits newCreditsTest(){
        Credits credit = new Credits();
        credit.setPayment(Payment.newPaymentTest());
        return credit;
    }
}

ПотокСистема переходит от того, когда счет-фактура генерируется, тип платежа записывается в таблице платежей, если он оплачивается наличными или в кредит, если платеж в кредит, информация хранится в таблице кредитов, поэтому мне нужно извлечь изТаблица кредитует всю информацию, хранящуюся в таблице кредитов, вводя только идентификатор счета.

Итак, в репозитории (CreditsRepository) я сделал это:

@Repository
@Qualifier(value="CreditsRepository")
public interface CreditsRepository extends CrudRepository<Credits, UUID>{
    Iterable<Credits> findByPago(Pago pago);
    @Query("SELECT c FROM Credits c JOIN c.payment p JOIN p.bill b WHERE b.id = :id")
    Iterable<Credits> findCreditsOfBillByBillId(@Param("id") UUID id);
}

Так что мне нужна помощь, чтобысделать хороший @ Query

1 Ответ

0 голосов
/ 29 сентября 2018

Ваш @Query абсолютно хорош.Вы также можете удалить @Query и использовать только spring-data-jpa эквивалентное имя метода следующим образом:

//no annotation here
public interface CreditsRepository extends CrudRepository<Credits, UUID> {

    //if you want to pass Bill object
    List<Credits> findAllByPaymentBill(Bill bill);

    //if you want to pass an id (UUID)
    List<Credits> findAllByPaymentBillId(UUID id);
}

Несколько вещей о вашем коде.

Если вы расширяете CrudRepository, вы не 'не требуется @Repository аннотация, а поскольку вы пишете интерфейс, вам также не нужен @Qualifier.

Вы можете просто @Autowire в вашей службе

    @Autowired
    private CreditsRepository creditsRepository;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...