Я не знаю, как создать запрос 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 типа объектов в таблице (иногда объект создается из электронной почты, иногда из файла):
user_id (null) -> тогда мне нужно найти все A объекты путем поиска по Message -> Account -> Iduser_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)?




Я предполагаю, что этот запрос слишком сложен для использования, полученного из запроса имени метода. Как указано в документации :
Хотя получение запроса, полученного из имени метода, довольно удобно, можно столкнуться с ситуацией, когда либо анализатор имени метода не поддерживает ключевое слово, которое нужно использовать, либо имя метода становится излишне уродливым. Таким образом, вы можете либо использовать именованные запросы 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). И идентификатор пользователя совпадает с идентификатором учетной записи.