Home > Enterprise >  List returning the same row from postgresdb
List returning the same row from postgresdb

Time:09-07

I have an issue where only the first row from my database is being returned multiple times within a list even though the SQL query shows different rows being returning. my jpa query is:

@Query(value = "SELECT BK.ISBN,"  
            "BK.AUTHOR, "  
            "BK.ID, "  
            "BK.PUBLISHER, "  
            "BK.GENRE, "  
            "BK.NUMBER_OF_PAGES, "  
            "BK.WEIGHT, "  
            "BK.PRICE, "  
            "BK.BOOK_TYPE, "  
            "BK.TITLE, "  
            "RV.STAR_RATING, "  
            "RV.REVIEW_DESCRIPTION, "  
            "RV.ID, "  
            "RV.ISBN, "  
            "RV.ID AS REVIEWID "  
            "FROM BOOKSTORE.BOOKS BK "  
            "INNER JOIN BOOKSTORE.REVIEWS RV "  
            "ON BK.ISBN = RV.ISBN "  
            "WHERE BK.ISBN = :ISBN",
            nativeQuery = true
    )
    List<BookAndReview> getBookAndReviews(String ISBN);

The object is:

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class BookAndReview implements Serializable {


    @Id
    @Column(name = "ID")
    Integer id;

    @Column(name = "REVIEWID")
    Integer reviewId;

    @Column(name = "ISBN")
    String ISBN;

    @Column(name = "STAR_RATING")
    float starRating;

    @Column(name = "REVIEW_DESCRIPTION")
    String reviewDescription;

    @Column(name = "AUTHOR")
    String author;

    @Column(name = "PUBLISHER")
    String publisher;

    @Column(name = "GENRE")
    String genre;

    @Column(name = "NUMBER_OF_PAGES")
    Integer numberOfPages;

    @Column(name = "WEIGHT")
    String weight;

    @Column(name = "PRICE")
    float price;

    @Column(name = "BOOK_TYPE")
    String bookType;

    @Column(name = "TITLE")
    String title;

}

i am returning this in the controller by simply calling the method but the response returns the following twice:

[
    {
        "id": 1,
        "reviewId": 1,
        "starRating": 4.3,
        "reviewDescription": "Test description",
        "author": "Tom Hindle",
        "publisher": "Cornerstone",
        "genre": "Fiction",
        "numberOfPages": 464,
        "weight": "319",
        "price": 7.49,
        "bookType": "Paperback",
        "title": "A Fatal Crossing",
        "isbn": "9781529157840"
    },
    {
        "id": 1,
        "reviewId": 1,
        "starRating": 4.3,
        "reviewDescription": "Test description",
        "author": "Tom Hindle",
        "publisher": "Cornerstone",
        "genre": "Fiction",
        "numberOfPages": 464,
        "weight": "319",
        "price": 7.49,
        "bookType": "Paperback",
        "title": "A Fatal Crossing",
        "isbn": "9781529157840"
    }
]

the review description there is the same in both objects even though in the database i have different reviews related to each book. I havent posted the controller code however that is simply calling the the repository and returning a list of BookAndReview

CodePudding user response:

You need to add the following commands to your sql.

GROUP BY BK.ISBN

The sql returns the right result according to filter by BK.ISBN

CodePudding user response:

Changed the query to use JPA joins instead. Added the following to the bookAndReview object

@OneToMany
@JoinColumn(name = "ISBN",referencedColumnName = "ISBN", insertable = false, updatable = false)
List<Reviews> reviews;

Query changed to use JPA

List<BookAndReview> getBookAndReviewByISBN(@Param("ISBN") String ISBN);
  • Related