我有两个实体:用户和电话。
用户实体:
@Getter
@Setter
@Accessors(chain = true)
@Entity
@Table(name = "user_table")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "username", unique = true, nullable = false)
@NonNull
private String username;
@Column(name = "firstname")
@NonNull
private String firstName;
@Column(name = "lastname")
@NonNull
private String lastName;
@Column(name = "age")
@NonNull
private Integer age;
@Column(name = "email", nullable = false, unique = true)
@NonNull
private String email;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "address_id", foreignKey = @ForeignKey(name = "fk_user_address_id"))
private Address address;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "phone_number", foreignKey = @ForeignKey(name = "fk_user_phone_number"))
private Phone phone;
}
电话实体:
@Getter
@Setter
@Accessors(chain = true)
@Entity
@Table(name = "phone_table")
public class Phone {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "phone_number", unique = true, nullable = false)
@NonNull
private String number;
}
我还创建了这些实体的 DTO 类。
@Data
@Accessors(chain = true)
public class CreateUserRequest {
private Long userId;
private String username;
private String firstName;
private String lastName;
private Integer age;
private String email;
private CreatePhoneRequest phone;
private CreateAddressRequest address;
}
@Data
@Accessors(chain = true)
public class UserResponse {
private Long id;
private String username;
private String firstName;
private String lastName;
private String email;
private int age;
private PhoneResponse phone;
private AddressResponse address;
}
}
和
@Data
@Accessors(chain = true)
public class CreatePhoneRequest {
private String phone;
}
@Data
@Accessors(chain = true)
public class PhoneResponse {
private String phone;
}
然后
UserRepository extends JpaRepository<Long, User>
我findUserByPhone_Number(String phonenumber
)
在服务中我制定了寻找用户的逻辑:
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final PhoneServiceImpl phoneServiceImpl;
// ***********************************************************
// ******************* FIND USER BY PHONE ********************
// ***********************************************************
@NonNull
@Transactional(readOnly = true)
@Override
public UserResponse getUserByPhoneNumber(String phoneNumber) {
return userRepository.findUserByPhone_Number(phoneNumber);
}
}
和用于发出请求的 UserController:
@RestController
@RequestMapping("/api/v1/users")
@RequiredArgsConstructor
public class UserController {
private final UserServiceImpl userService;
private final Logger log = LoggerFactory.getLogger(UserController.class);
@GetMapping(value = "/phonenumber/{number}", produces = APPLICATION_JSON_VALUE)
public UserResponse getUserByPhoneNumber(@PathVariable String number) {
UserResponse user = userService.getUserByPhoneNumber(number);
System.out.println(user);
return user;
}
}
我可以获取用户列表,我可以通过 ID 获取用户......但是当我尝试通过电话号码(连接表)获取用户时,我收到:
{
"message": "Specified result type [com.app.apringlearn.app.ResponseRequest.UserResponse] did not match Query selection type [com.app.apringlearn.app.Enteties.User] - multiple selections: use Tuple or array"
}
只是让你的
getUserByPhoneNumber
返回 User
但不是 UserResponse
@NonNull
@Transactional(readOnly = true)
@Override
public User getUserByPhoneNumber(String phoneNumber) {
return userRepository.findUserByPhone_Number(phoneNumber);
}
并相应地更改所有链接类。
它应该按您的预期工作...