Почему я не могу искать сущности между объединенными таблицами?

У меня есть два объекта: Пользователь и Телефон.

Пользовательская сущность:

@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"
}

Можете ли вы ограничить свой пост одним вопросом? Это уже достаточно долго. Также вы можете удалить ненужные детали, такие как полный список нерелевантных полей. Также добавьте полный стек вашей ошибки.

talex 03.07.2024 14:30

думаю сейчас лучше....

Артём Орёл 03.07.2024 15:21

Ваш репозиторий возвращает UserResponse вместо User. Не знаю почему. Он должен возвращать User, а не UserResponse. Об этом же говорит вам исключение.

M. Deinum 03.07.2024 16:19

Это классы объектов, которые будут получать и отправлять наши контроллеры. Это не давало бы моделей предметной области и не открывало бы информацию о базе данных, к тому же их модели легче расширять и передавать через них любой объем информации. Это хорошие практики.

Артём Орёл 03.07.2024 16:27

Добавьте код UserRepository

talex 03.07.2024 19:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

просто сделай свой getUserByPhoneNumber возврат User, но не UserResponse

@NonNull
    @Transactional(readOnly = true)
    @Override
    public User getUserByPhoneNumber(String phoneNumber) {
        return userRepository.findUserByPhone_Number(phoneNumber);
    } 

и соответствующим образом измените все связывающие классы.

должно работать так, как вы ожидаете...

Другие вопросы по теме

Похожие вопросы

Apache POI xlsx Ошибка «Мы обнаружили проблему с некоторым содержимым в *.xlsx. Хотите, чтобы мы попытались восстановить его, насколько это возможно?» Ошибка из-за ошибки синтаксического анализа XML
InputStream.available() странное поведение
Класс символьной ссылки недоступен: класс sun.util.calendar.ZoneInfo из интерфейса spark.sql.catalyst.util.SparkDateTimeUtils
Не могу понять, почему мой логинконтроллер не может аутентифицировать пользователя. Spring Security сводит меня с ума
Почему мой класс не может быть запущен после объявления пакета и не может быть найден другим классом в том же пакете/папке?
Откройте видимое окно Cmd в Java
В чем смысл локали в DateTimeFormatter?
Версия Eclipse 24-6 не работает с плагином Lombok
Изменить массив так, чтобы все нули были перемещены в конец, сохраняя при этом порядок ненулевых элементов
Как увеличить максимальную длину выражений SpEL в весенней загрузке 3.3.0?