如何在springboot

时间:2017-11-19 00:05:30

标签: java spring-boot spring-data-jpa

在springboot中,您可以拥有extends JpaRepository<User, String>

的存储库

现在,如果要向该存储库写入查询,可以编写多个findBy查询,例如:

User findByUsername(String username);
User findByFirstName(String firstName);
User findByFirstNameAndLastName(String firstName, String lastName);

然后你需要匹配的控制器,如:

@RequestMapping(value = "/users/{username}" , method = RequestMethod.GET)
public @ResponseBody List<User> getUser(@PathVariable("username") String username) {
    return userService.findByUsername(username);
}

等等...

我不想为每个元素组合编写每个findBy,并创建所有匹配的控制器。

所以我想知道的是如何搜索整个对象。例如发布类似

的内容
{
"username":"freddy"
}

将按用户名搜索,同样

{
"firstName":"Fred",
"lastName":"Doe"
}

将按名字和姓氏进行搜索。

有没有办法同时编写一个JpaRepository方法和一个控制器,可以使用任何字段组合(在这种情况下)User对象,并执行搜索?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试JPA的按示例查询JpaRepository扩展了另一个名为QueryByExampleExecutor的接口,它有很多方法可以通过示例进行搜索。这是一个简单的例子,

// here the first name, last name, and username may be null 
// or not null. Make sure that they are not all at the same time
String firstName = "James";
String lastName = null;
String userName = "jbond";

Example<User> example = Example.of(new User(firstName, lastName, username));
Iterable<User> = repository.findAll(example);

你可以做其他奇特的事情。这是一个example

  

Q值。有没有办法返回唯一的结果字段?因此,在该示例中,传递firstName将返回所有lastNames和所有可能的userNames的唯一列表

对于这种情况,我使用过本机查询。这是一个例子,

@Query(value = "SELECT DISTINCT u.lastName FROM User u WHERE u.firstName = ?1", 
       nativeQuery = true)
List<String> findDistinctLastName(String firstName);