老读者,第一次张贴者。
我需要帮助。我无法弄清楚 URL 参数 ↔ 数据库。
情况: 我将 .../users/?role=admin&title=manager 放入 postman
预期: 所有作为经理和管理员的用户的 json。
实际: 我的电脑爆炸了。
@RestController
@RequestMapping(path = USERS_PATH)
@Log4j2
public class UserController
// other code...
@GetMapping
public ResponseEntity<List<User>> getUserQuery(
@RequestParam( required = false, name = "name") String name,
@RequestParam( required = false, name = "title") String title,
@RequestParam( required = false, name = "roles") String roles,
@RequestParam( required = false, name = "email") String email,
@RequestParam( required = false, name = "password") String password
) {
log.info("Request received for getUserQuery");
return new ResponseEntity<>(userService.doSomething???(), HttpStatus.OK); // stuff I don't understand yet)
}
我的问题: 在 Controller 之后,什么进入了 UserService 和 UserRepository?
额外信息: 我正在使用 Spring Boot 和 H2,但稍后可能需要切换到 PostgreSQL 数据库。
我有下面的代码来检查在服务层上的放置和发布期间是否有唯一的电子邮件,但我无法得到类似的东西来解决这个问题。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.email = ?1")
Optional<User> findUserByEmail(String email);
}
咆哮: 这似乎是一件非常普遍的事情,我应该已经知道该怎么做了。我不。我已经在互联网上阅读了大约 5 个小时。仍然没有回答。我学习了有关规范、Querydsl、@ModelAtribute、DAO 和映射 RequestParams 的知识。但是,我找不到如何连接这些点。所以,我完全成为穴居人并尝试使用 StringBuilder 和一堆逻辑制作一个 @Query 参数......我开始螺旋上升。
无论如何,我想避免规范和 Querydsl。只需使用 @Query 和 JPA,但更重要的是,我想要一个干净的解决方案/最佳实践。
最佳答案
这是一个工作片段。我认为您的存储库有问题。您正在使用 @Query 以及开箱即用的查询支持。
服务和存储库中的内容:存储库层 (repo) 类用于抽象与数据库的交互。
服务层与存储库层交互,并对存储库层返回的数据进行处理。
用户实体
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@Getter
@Setter
@Entity
@Table(name = "users")
@NoArgsConstructor
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "designation")
private String designation;
@Column(name = "email")
private String email;
}
用户存储库
import com.example.code.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {
Optional<UserEntity> findByName(String name);
List<UserEntity> findByDesignation(String designation);
Optional<UserEntity> findByEmail(String email);
}
用户服务
import java.util.Collection;
public interface UserService {
void createUser(UserDTO userDTO);
Collection<UserDTO> getUsers(
String username,
String designation,
String email
);
}
UserServiceImpl
import com.example.code.dto.UserDTO;
import com.example.code.entity.UserEntity;
import com.example.code.mapper.UserMapper;
import com.example.code.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.apache.catalina.User;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Override
public void createUser(UserDTO userDTO) {
UserEntity userEntity = new UserEntity();
userEntity.setName(userDTO.getName());
userEntity.setDesignation(userDTO.getDesignation());
userEntity.setEmail(userDTO.getEmail());
userRepository.save(userEntity);
}
@Override
public Collection<UserDTO> getUsers(String username, String designation, String email) {
Set<UserDTO> userDTOS = new HashSet<>();
if( !username.isBlank() && !username.isEmpty() && userRepository.findByName(username).isPresent() ) {
userDTOS.add(UserMapper.toDto(
userRepository.findByName(username).get()
));
}
if(!designation.isBlank() && !designation.isEmpty()) {
userDTOS.addAll(
userRepository.findByDesignation(designation)
.stream()
.map(UserMapper::toDto)
.collect(Collectors.toSet())
);
}
if( !email.isBlank() &&
!email.isEmpty() &&
userRepository.findByEmail(email).isPresent() ) {
userDTOS.add(UserMapper.toDto(
userRepository.findByEmail(email).get()
));
}
return userDTOS;
}
}
用户映射器
import com.example.code.dto.UserDTO;
import com.example.code.entity.UserEntity;
public class UserMapper {
public static UserDTO toDto(UserEntity entity) {
UserDTO userDTO = new UserDTO();
userDTO.setName(entity.getName());
userDTO.setDesignation(entity.getDesignation());
userDTO.setEmail(entity.getEmail());
return userDTO;
}
}
测试 Controller
@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
public class TestController {
private final UserService userService;
@PostMapping
public ResponseEntity<String> createUser(@RequestBody final UserDTO userDTO) {
try {
userService.createUser(userDTO);
}catch (Exception e) {
return ResponseEntity.internalServerError().body("Failure");
}
return ResponseEntity.ok("Success");
}
@GetMapping
public ResponseEntity<Collection<UserDTO>> getUsers(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "designation", required = false) String designation,
@RequestParam(value = "email", required = false) String email
) {
return ResponseEntity.ok(userService.getUsers(name, designation, email));
}
}
关于java - 如何向 "/users?<some-query-here>"发出 GET 请求,然后在 JSON 数组中返回所有满足查询条件的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70241010/