【问题标题】:PostgreSQL query works on pgAdmin but not in Spring BootPostgreSQL 查询适用于 pgAdmin 但不适用于 Spring Boot
【发布时间】:2022-01-26 00:19:55
【问题描述】:

查询SELECT * FROM books WHERE (isbn || ' ' || author || ' ' || name) ILIKE '%el%' 返回

在 pgAdmin(PostgreSQL 工具)中执行时来自完整数据库

但是当我尝试在 Spring Boot 中运行相同的查询时,它似乎不起作用,它返回一个空列表。我不知道我的查询是 PostgreSQL 特定的还是本机 SQL,如果它不是本机 SQL,那么我想它不起作用是合理的,因为我有 nativeQuery = true,如果我正确理解了这意味着本机 SQL 是预期的。没有它,应用程序甚至无法运行。如果情况如前所述,如何在查询中指定我要使用PostgreSQL?

BookController.java

@GetMapping("/search")
public String search(@RequestParam(value = "keyword") String keyword, Model model) {
    List<Book> books = bookService.search(keyword);
    model.addAttribute("books", books);
    return "books";
}

BookService.java

public List<Book> search(String keyword) {
      return bookRepository.search(keyword);
}

BookRepository.java

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {

    List<Book> findAll();

    @Query(value = "SELECT * FROM books WHERE (isbn || ' ' || author || ' ' || name) ILIKE '%?%'", nativeQuery = true)
    List<Book> search(String keyword);

}

Books.html 我输入的值是el

<form class="col-12 col-lg-auto mb-3 mb-lg-0 me-lg-3" th:action="@{books/search}" method="get">
     <input th:name="keyword" type="search" class="form-control form-control-dark" placeholder="Search..." aria-label="Search">
</form>

【问题讨论】:

    标签: java spring database postgresql spring-data-jpa


    【解决方案1】:

    参数? 可能未在查询中正确应用。将'%?%' 更改为'%' || ? || '%',如下所示:

    @Query(value = "SELECT * FROM books WHERE (isbn || ' ' || author || ' ' || name) ILIKE '%' || ? || '%'", nativeQuery = true)
    

    【讨论】:

    • 这非常有效。
    • 我自己不是 Java 程序员,但这对 SQL 注入安全吗?
    • @FrankHeikens 不,这与 SQL 注入无关。选词不当。固定。
    【解决方案2】:

    试试

    @Query(value = "SELECT * FROM books WHERE (isbn || ' ' || author || ' ' || name) ILIKE %?1%", nativeQuery = true)
         List<Offers> search(String keyword);
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 2021-03-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2011-05-20
      • 2020-04-13
      相关资源
      最近更新 更多