0

Ich habe ein Repository als mit einem Verfahren, darin definiert folgt:SpringData Repository Verfahren leere Auflistung Rückkehr

public interface BillPaymentRepository extends JpaRepository<BillPayment, String>{ 
    Collection<BillPayment> findByBillBillNumber(String billNo); 

} 

Relevante Einheiten sind wie folgt:

@Entity 
public class BillPayment { 

    @Id 
    private String transactionNumber; 

    @ManyToOne 
    private Bill bill; 

    private Float amountPaid; 

    public String getTransactionNumber() { 
     return transactionNumber; 
    } 

    public Bill getBill() { 
     return bill; 
    } 

    public Float getAmountPaid() { 
     return amountPaid; 
    } 

    public BillPayment(String transactionNumber, Bill bill, Float amountPaid) { 
     this.transactionNumber = transactionNumber; 
     this.bill = bill; 
     this.amountPaid = amountPaid; 
    } 

    public BillPayment() { 
    } 

} 

andere Entität:

@Entity 
public class Bill { 

    @Id 
    private String billNumber; 

    @OneToOne 
    private User user; 

    private Month billMonth; 

    private Float billAmount; 

    private Float dataUtilized; 

    public String getBillNumber() { 
     return billNumber; 
    } 

    public User getUser() { 
     return user; 
    } 

    public Month getBillMonth() { 
     return billMonth; 
    } 

    public Float getBillAmount() { 
     return billAmount; 
    } 

    public Float getDataUtilized() { 
     return dataUtilized; 
    } 

    public Bill(String billNumber, User user, Month billMonth, Float billAmount, Float dataUtilized) { 
     this.billNumber = billNumber; 
     this.user = user; 
     this.billMonth = billMonth; 
     this.billAmount = billAmount; 
     this.dataUtilized = dataUtilized; 
    } 

    public Bill() { 
    } 

} 

Im Folgenden finden Sie die Daten in den relevanten Repositories:

Bill bill1 = billRepository.save(new Bill("B1", user1, Month.APRIL, 10F, 10F)); 
Bill bill2 = billRepository.save(new Bill("B2", user2, Month.APRIL, 60F, 60F)); 
Bill bill3 = billRepository.save(new Bill("B3", user3, Month.APRIL, 50F, 50F)); 
Bill bill4 = billRepository.save(new Bill("B4", user4, Month.APRIL, 20F, 20F)); 
Bill bill5 = billRepository.save(new Bill("B5", user1, Month.MAY, 30F, 30F)); 
Bill bill6 = billRepository.save(new Bill("B6", user2, Month.MAY, 30F, 30F)); 
Bill bill7 = billRepository.save(new Bill("B7", user3, Month.MAY, 40F, 40F)); 
Bill bill8 = billRepository.save(new Bill("B8", user4, Month.MAY, 10F, 10F)); 
Bill bill9 = billRepository.save(new Bill("B9", user1, Month.JUNE, 10F, 10F)); 
Bill bill10 = billRepository.save(new Bill("B10", user2, Month.JUNE, 10F, 10F)); 
Bill bill11 = billRepository.save(new Bill("B11", user3, Month.JUNE, 50F, 60F)); 
Bill bill12 = billRepository.save(new Bill("B12", user4, Month.JUNE, 20F, 20F)); 
billRepository.save(new Bill("B13", user1, Month.JULY, 10F, 10F)); 
billRepository.save(new Bill("B14", user2, Month.JULY, 30F, 30F)); 
billRepository.save(new Bill("B15", user3, Month.JULY, 15F, 0F)); 
billRepository.save(new Bill("B16", user4, Month.JULY, 10F, 10F)); 

billPaymentRepository.save(new BillPayment("T1", bill1, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill2, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill3, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill4, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill5, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill6, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill7, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill8, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill9, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill10, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill11, 10F)); 
billPaymentRepository.save(new BillPayment("T1", bill12, 10F)); 

Aber wenn ich die Methode aufrufen, um das Ergebnis zu erhalten, wird die leere Sammlung zurückgegeben.

@RestController 
@RequestMapping("/payment-details") 
class BillPaymentRestController { 
    private final BillPaymentRepository billPaymentRepository; 

    @Autowired 
    public BillPaymentRestController(BillPaymentRepository billPaymentRepository) { 
     this.billPaymentRepository = billPaymentRepository; 
    } 

    @RequestMapping(method=RequestMethod.GET) 
    Collection<BillPayment> getPaymentDetailsByBillNo(@RequestParam String billNo){ 

     /*System.out.println(billNo); 
     for (BillPayment billPayment : this.billPaymentRepository.findByBillBillNumber(billNo)) { 
      System.out.println(billPayment.getTransactionNumber()); 
     } 
     System.out.println(this.billPaymentRepository.findByBillBillNumber(billNo));*/ 

     return this.billPaymentRepository.findByBillBillNumber(billNo); 
    } 
} 

ich POSTMAN bin mit dem Service testen eine GET-Anfrage mit:

localhost:8080/payment-details?billNo=B1 

Ich habe andere ähnliche Dienstleistungen solche Funktionalitäten im selben Projekt, die fein arbeiten. Der einzige Unterschied zwischen ihnen und diesem war die Beziehung zwischen Entitäten. Also lese ich über OneToMany und ManyToOne Realationaships. Und nach diesem Tutorial: https://howtoprogramwithjava.com/hibernate-manytoone-unidirectional-tutorial/ alles scheint in Ordnung zu sein.

Kann mir bitte jemand helfen, was mache ich falsch?

+0

Ich denke, Ihre Abfrage 'findByBillBillNumber' ist nicht korrekt. Sie versuchen, auf das BillNumber-Feld innerhalb des Bill-Objekts zuzugreifen. Haben Sie versucht, ein BillRepository zu definieren? Und definieren Sie die Abfrage 'findByBillNumber' in diesem neuen Repository? – amicoderozer

+0

Ich habe bereits 'BillRepository', aber die Methode' findByBillBillNumber' wurde nicht definiert (da IMO nicht benötigt wird, weil ich dasselbe in '' UserRepository'' in anderen Controllern mache und die Methodendefinition in diesen Fällen nicht benötigt wird, nur Repository ist definiert, und es funktioniert gut). Trotzdem habe ich versucht, die Methode hinzuzufügen und keinen Gewinn. –

Antwort

0

Das Problem liegt in Ihren Daten. Sie haben unterschiedliche Zahlungen mit der gleichen ID. Wenn Sie die Methoden Ihres Save ausführen, fügen Sie nur eine Zahlung ein und aktualisieren sie dann mit den anderen Rechnungen. So kann Ihre Methode finden keine Zahlung, die mit Rechnung 1 übereinstimmen, weil es nur eine Zahlung in db, deren Rechnung 12 ist.

Darüber hinaus ist Rechnungsnummer Ihre ID, wahrscheinlich ist es besser mit findByBill als Abfrage-Methode und Rechnungsobjekt als Parameter

+0

Ahh, das habe ich verpasst. Kopieren und Einfügen der Daten, vergessen zu aktualisieren. Mein Fehler. Gab den einzelnen Zeilen eindeutige Schlüssel und jetzt ist es perfekt. Eine Sache, die mich gerade in den Bann gezogen hat: 'save()' ist kein typischer DB-Einfügevorgang, sondern eher ein Update. Wenn es wie insert gewesen wäre, hätte es den Fehler wegen 'Unique Constraint Violation 'auf den zweiten' save() 'Aufruf geworfen. Ist es nicht? –

+0

Die Save-Methode wird beibehalten oder die angegebene Entity zusammenführen, je nachdem ob sie existiert oder nicht. Sie finden weitere Informationen dazu in [JPA Repository Documentation] (http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html) - Abschnitt 2.2.1 – robert08