如何使用HQL从实体查询元素集合

时间:2018-09-08 00:15:25

标签: hibernate hql embeddable

任何人都知道如何使用HQL从实体查询元素集合吗? 我正在尝试从给定的LiveTournament加载所有计划,其中回合是某个数字。我需要一个查询:

select m from MatchSchedule m where m.round=:round and m.tournament=:id

但是我想这是因为“ MatchSchedule不是实体而是可嵌入的”,这给了我一个“未映射”异常。

我的LiveTournament实体的结构如下:

public class LiveTournament {
@Id
private int id;
@OneToOne
@JoinColumn(name="id")
@MapsId
private Tournament tournament;
private TournamentParameters parameters;
private TournamentRoundData roundData;

@ElementCollection
@JoinTable(name="MatchSchedule", joinColumns=@JoinColumn(name="tournamentId"))
private Collection<MatchSchedule> matchSchedules = new ArrayList<>();
...

我的MatchSchedule可嵌入:

public class MatchSchedule {
private int round;
private Timestamp startDate;
@OneToOne
@JoinColumn(name="server")
private Server server;
...

1 个答案:

答案 0 :(得分:0)

根据您的澄清进行了更新:

模型对象需要@Entity表示它是模型对象。实体和ID是必填项。

如此:

@Entity
class <modelName> {

   @id
   ...

} 

您需要在from子句中为模型添加一个别名,并将别名添加到您的选择中

如此:

SELECT o FROM uk.xxx.dto.tournament.stages.LiveTournament o

由于没有“ where子句”,因此我假设您计划获取LiveTournament的列表。我还假设您有matchSchedules的吸气剂。

    String hql = "select o from LiveTournament o";
    Query query = <*Your persistence context*>.createQuery(hql);
    List<LiveTournament> list = query.getResultList();
    for(LiveTournament l : list) {
        List<MatchSchedule> matchSchedList = l.getMatchSchedules());
        //do something with this list of matchSchedule
     } 

注意:您可以选择一个映射对象列表,然后仅检索所需的内容。像这样:

    String hql = "select m.<item1>, m.<item2>, ... from MatchSchedule m where ....;
    Query query = <*Your persistence context*>.createQuery(hql);
    List<Map<String,Object>> list = query.getResultList();

如果是单个物品,您可以取回地图:

String hql = "select m.<item1>, m.<item2>, ... from MatchSchedule m where ....;
Query query = <*Your persistence context*>.createQuery(hql);
Map<String,Object> map = (Map<String, Object>) query.getSingleResult()
相关问题