【发布时间】:2017-08-18 23:02:55
【问题描述】:
我在 Spring Boot 应用程序中遇到了 Spring Data Rest 的不同行为 当我从对象存储库类查询时,具有自定义查询以通过匹配电子邮件 ID 来检索用户对象,并且电子邮件 ID 是唯一的。我得到空值并且对象存在。 我正在从邮递员那里调用 Rest URI。 --UserRepository
@Repository
@Transactional
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value ="select u from User u where u.email = :email")
User findByEmail(@Param("email") String email);
}
--UserServiceImpl
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService{
@Autowired
private UserRepository userRepository;
@Override
public User findByEmail(String email) {
return userRepository.findByEmail(email);
}
}
--控制器
@RestController
@RequestMapping("/api")
public class UserControllerRest {
@Autowired(required = true)
UserServiceImpl userService;
@RequestMapping(value = "/user/email/{email}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<User> getUserByEmail(@PathVariable("email") String email) {
System.out.println("Fetching User with id " + email);
User user = userService.findByEmail(email);
if (user == null) {
System.out.println("User with email " + email + " not found");
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<User>(user, HttpStatus.OK);
}
}
这方面需要帮助
【问题讨论】:
-
我们能提供什么帮助?您只需要开始调试:您传递给查询的电子邮件是否是您认为的电子邮件(没有尾随或前导空格等)?电子邮件是否真的存在于表中?插入它的事务是否已提交?您确定该应用程序使用您认为它正在使用的数据库或架构吗?它适用于另一个现有的电子邮件吗?在代码中添加跟踪。使用您的调试器。我们在这里无能为力。
-
是的电子邮件存在于 db 中,我还检查了 trim ,当我尝试获取对象列表时,它向我显示具有电子邮件 ID 的特定对象,但是当我尝试作为单个对象检索时,我是拿不到。
-
我在 sql 查询中检查了类似的条件,它返回数据,可能是前导空格的问题。 @Query(value = "select firstName,lastName from User u where u.email like %:email%") ,但类似条件不是必需的,因为它会返回对象列表
-
我应该在哪里添加对要忽略的前导空格的检查,我尝试修剪电子邮件的参数字符串,但在处理 user = userService.findByEmail(email.toString().trim() 时出现异常异常:"java.lang.IllegalArgumentException: 参数绑定的名称不能为空或空!对于命名参数,您需要使用@Param 查询 Java 版本
-
明确一点:如果您将方法签名更改为
List<User> findByEmail(@Param("email") String email),是否一切正常。如果没有,您是否在修剪后使用不同的电子邮件地址进行了尝试。
标签: spring hibernate spring-boot spring-data spring-data-jpa