所以这个问题已经被问过几次了,但似乎没有人以可以帮助我的方式回答它。我目前正在为处理产品数据的简单应用程序制作后端。它甚至没有使用 JSP,只是一个普通的 Rest 后端。使用 Spring 的 RestController。
“问题”是:启动后的第一个请求比其他所有请求需要更长的时间才能从服务器获得答案。(我只是用一个简单的 JPA 用户实体来测试 Postman)
需要考虑的一些事项:
如何使第一个请求更快/如何强制 Spring 在第一个请求到来之前实际初始化所有内容?
无论如何,一些代码:
用户.java:
@Entity
@Table(name = "users")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@NonNull
private String firstName;
@NonNull
private String lastName;
@NonNull
@OneToOne(cascade = CascadeType.ALL)
private Address billingAddress;
//a bit more. a list and another address
}
Run Code Online (Sandbox Code Playgroud)
用户控制器.java:
@RestController
@RequestMapping("users")
public class UserController …Run Code Online (Sandbox Code Playgroud) 为了过度简化问题:我们有一个类/表 Wine(表“wines”),除其他属性外,它还具有:
...其中 Origin 是另一个类(带有表“origins”),只有region: String和country: String。
我想要在我的存储库中创建一个搜索方法,供 RestController 使用。
RestController中的方法声明如下:
@GetMapping("/search")
public Wine searchProduct(
@RequestParam Optional<String> searchTerm,
@RequestParam Optional<Origin> origin) {
// ???
}
Run Code Online (Sandbox Code Playgroud)
我现在想做的是:为数据库创建一个查询,其中使用 searchTerm(如果给定),与 origin 相同。而且它应该是可分页的。例子:
SELECT * FROM wines JOIN origins ON wines.origin_id = origins.id
WHERE (name LIKE $searchTerm OR description LIKE $searchTerm) AND (/*origin check*/)
Run Code Online (Sandbox Code Playgroud)
如果未给出搜索词,则整个“() AND”部分不应出现在查询中。如果没有给出 Origin...你就明白了。
我尝试过的事情:
(天真地)在我的存储库中构建一个大规模查询(实现 CrudRepository),如下所示。
Page<Wine> findWinesByNameLikeOrDescriptionLikeAndOriginEquals(..., Pageable pageable);