Spring Boot JPA — найти по 2 столбцам

Я не знаю, как создать запрос JPA, чтобы получить все записи из моей таблицы:

@Entity
@Table(name = "A")
public class A{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, updatable = false)
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "message_id")
    private Message;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}
@Entity
@Table(name = "message")
@Getter
@Setter
public class Message{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, updatable = false)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "account_id", foreignKey = @ForeignKey(name = "FK_account_to_message"))
    private Account account; //and then search by Account.id
}

ТАК У меня есть 2 типа объектов в таблице (иногда объект создается из электронной почты, иногда из файла):

  1. один тип без user_id (null) -> тогда мне нужно найти все A объекты путем поиска по Message -> Account -> Id
  2. второй тип с user_id -> мы можем напрямую получить A объекты по значениям в столбце user_id

Я хочу получить все записи для конкретного user_id -> как это сделать наиболее эффективным способом? Я не хочу вызывать 2 метода в репозитории:

 User user = userService.getEmail();
        List<A> aObjects= Stream.concat(ARepository.findByMessage_Account_Id(user.getId()).orElse(new ArrayList<>()).stream(),
                aRepository.findByUser_Id(user.getId()).orElse(new ArrayList<>()).stream()).collect(Collectors.toList());

Можно ли создать ОДИН метод репозитория, который находит все записи для двух разных объектов (один с user_id, а второй без user_id)?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
2
0
279
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я предполагаю, что этот запрос слишком сложен для использования, полученного из запроса имени метода. Как указано в документации :

Хотя получение запроса, полученного из имени метода, довольно удобно, можно столкнуться с ситуацией, когда либо анализатор имени метода не поддерживает ключевое слово, которое нужно использовать, либо имя метода становится излишне уродливым. Таким образом, вы можете либо использовать именованные запросы JPA через соглашение об именах, либо, скорее, аннотировать свой метод запроса с помощью @Query.

Итак, я бы предложил просто написать следующий запрос:

@Query("select aa from A aa left join aa.user u left join aa.message msg left join msg.account acc where (u is null and acc is not null and acc.id = :userId) or (u is not null and u.id = :userId)")
List<A> findByUserOrAccountId(@Param("userId") Long userId);

К сожалению, я по-прежнему получаю значения, удовлетворяющие первому требованию: где (aa.user равно null и aa.message.account.id = :accountId). И идентификатор пользователя совпадает с идентификатором учетной записи.

Matley 17.12.2020 01:35

Ага, теперь работает :) Спасибо :) Это было не так просто...

Matley 17.12.2020 20:57

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