У меня есть два объекта: Пользователь и Телефон.
Пользовательская сущность:
@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;
}
}
И я могу получить список пользователей, я могу получить пользователя по идентификатору..... но когда я пытаюсь получить пользователя по номеру телефона (объединенная таблица), я получаю:
{
"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"
}
думаю сейчас лучше....
Ваш репозиторий возвращает UserResponse
вместо User
. Не знаю почему. Он должен возвращать User
, а не UserResponse
. Об этом же говорит вам исключение.
Это классы объектов, которые будут получать и отправлять наши контроллеры. Это не давало бы моделей предметной области и не открывало бы информацию о базе данных, к тому же их модели легче расширять и передавать через них любой объем информации. Это хорошие практики.
Добавьте код UserRepository
просто сделай свой getUserByPhoneNumber
возврат User
, но не UserResponse
@NonNull
@Transactional(readOnly = true)
@Override
public User getUserByPhoneNumber(String phoneNumber) {
return userRepository.findUserByPhone_Number(phoneNumber);
}
и соответствующим образом измените все связывающие классы.
должно работать так, как вы ожидаете...
Можете ли вы ограничить свой пост одним вопросом? Это уже достаточно долго. Также вы можете удалить ненужные детали, такие как полный список нерелевантных полей. Также добавьте полный стек вашей ошибки.