Собственный запрос к JPQL (hql) - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть таблица истории пользователей и измененные статусы. имя таблицы 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);

но это решение использует подзапрос. есть лучшее решение без подзапроса?

...