我正在图书馆申请。因此,我需要按书名搜索一本书。
控制器
@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:结果返回多个元素
答案 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放在方法名称的末尾