результат возвращает более одного элемента;вложенным исключением является javax.persistence.NonUniqueResultException: результат возвращает более одного элемента - PullRequest
0 голосов
/ 27 августа 2018

Я делаю приложение библиотеки.Итак, мне нужно найти книгу по названию.

Контроллер

@GetMapping(path="/viewBook")
public String viewBook(Book book,HttpServletRequest request)
{
    request.setAttribute("mode", "MODE_VIEW");
            request.setAttribute("tb", bookService.findByTitle(book.getTitle()));
          return "homepage";


        }

JSP-страница

<c:when test="${mode=='MODE_VIEW' }">
    <div class="container text-center">
        <h3>Add A Book</h3>
        <hr>
        <form class="form-horizontal" method="GET" action="/viewBook">
            <div class="form-group">
                <label class="control-label col-md-3">Enter Title</label>
                <div class="col-md-7">
                    <input type="text" class="form-control" name="title"
                                value="${book .title}" />
                </div>
            </div>
            <div class="form-group ">
                <input type="submit" class="btn btn-primary" value="View" />
            </div>
        </form>
    </div>
</c:when>

Класс обслуживания

public String findByTitle(String title) {

    return BookRepo.findByTitle(title);
}

BookRepo

public interface BookRepository extends CrudRepository<Book,Integer> {

    public String findByTitle(String title);

}

Книга

@Entity
@Table(name="Boooks")
public class Book {


    public int id;
    private String author;
    private String title;



    public Book()
    {

    }
    public Book(String author, String title, int id) {
        super();
        this.id=id;
        this.author = author;
        this.title = title;
    }
    @Id
    //here comes getters and setters i have omitted them here.

    @Override
    public String toString() {
        return "Book [id=" + id + ", author=" + author + ", title=" + title + "]";
    }


}

Я получаю эту ошибку

javax.persistence.NonUniqueResultException: результат возвращает более одного элемента

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Эта услуга возвращает более 1 элемента.В вашем коде вы ожидаете одну строку, но ваш код возвращает более 1 строки.

Этот код будет работать

// Класс обслуживания

public List<String> findByTitle(String title) {

return BookRepo.findByTitle(title);
}

//BookRepo

public interface BookRepository extends CrudRepository<Book,Integer> {

    public List<String> findByTitle(String title);

}
0 голосов
/ 21 мая 2019

Попробуйте попробовать префикс findFirst.

public interface BookRepository extends CrudRepository<Book,Integer> {

   public Book findFirstByTitleIgnoreCase(String title);

}

Приведенный выше код вернет первый результат, если у вас есть дубликаты книг.

Улучшение, когда вынужно найти строку и хорошая практика - поставить суффикс IgnoreCase в конце имени метода

0 голосов
/ 27 августа 2018

Убедитесь, что заголовок уникален в таблице.

bookService.findByTitle(book.getTitle())

Эта строка возвращает несколько строк из БД, но ваш метод в службе или dao ожидает один уникальный результат.

Проверьте службуи дао классы для устранения неполадок.

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