结果返回多个元素;嵌套的异常是javax.persistence.NonUniqueResultException:结果返回多个元素

时间:2018-08-27 05:47:32

标签: java spring-boot

我正在图书馆申请。因此,我需要按书名搜索一本书。

控制器

@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 :(得分:1)

此服务返回了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);

}

答案 1 :(得分:0)

确保标题在表格中是唯一的。

bookService.findByTitle(book.getTitle())

此行从数据库返回多行,但是您的服务或dao中的方法期望单个唯一结果。

检查您的服务和dao类以进行故障排除。

答案 2 :(得分:0)

尝试查找FirstFirst前缀。

public interface BookRepository extends CrudRepository<Book,Integer> {

   public Book findFirstByTitleIgnoreCase(String title);

}

当您有重复的书籍时,上面的代码将返回第一个结果。

当您需要查找字符串和一个很好的做法时,一个改进是将sufix IgnoreCase放在方法名称的末尾