У меня есть таблица истории пользователей и измененные статусы.
имя таблицы history
. любой статус изменения сохранен как строка в таблице истории.
я не хочу получить текущий статус пользователя (статус последнего пользователя).
структура модели похожа на:
Таблица истории:
@Entity
@Table(name = "history")
class HistoryEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
@ManyToOne
@JoinColumn(name = "status_id" , nullable = false)
StatusEntity status;
@ManyToOne
@JoinColumn(name = "user_id" , nullable = false)
UserEntity user;
//some thing else ...
}
Таблица состояния :
@Entity
@Table(name = "status")
class StatusEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
@OneToMany(mappedBy = "status")
@JsonBackReference
private Set<HistoryEntity> histories;
}
Таблица пользователей:
@Entity
@Table(name = "user")
class UserEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
@OneToMany(mappedBy = "user")
@JsonBackReference
private Set<HistoryEntity> histories;
//some thing else ...
}
я использую этот метод на JpaRepository
:
@Query(
nativeQuery = true ,
value = "SELECT hs.status_id FROM history hs innerjoin " +
"(SELECT max(hs2.id) as id , hs2.user_id as user_id FROM history hs2 group by hs2.user_id) as hg" +
"ON hs.id = hg.id AND hs.user_id = hg.user_id" +
"WHERE hs.user_id = :userId"
)
Integer findHistoryStatusIdByUserId(@Param("userId") int userId);
но я хочу изменить это на JPQL
, решение, которое я нашел:
@Query(
value = "SELECT hs.status.id FROM HistoryEntity hs " +
"WHERE hs.user.id = :userId AND " +
"hs.id = (SELECT max(hs2.id FROM HistoryEntity hs2 WHERE hs2.user.id = hs.user.id)"
)
Integer findHistoryStatusIdByUserId(@Param("userId") int userId);
но это решение использует подзапрос.
есть лучшее решение без подзапроса?