【问题标题】:How to query an element collection from an entity using HQL如何使用 HQL 从实体中查询元素集合
【发布时间】:2018-09-08 00:15:24
【问题描述】:

有人知道如何使用 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;
...

【问题讨论】:

    标签: hibernate hql embeddable


    【解决方案1】:

    根据您的说明更新:

    模型对象需要@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()
    

    【讨论】:

    • 我不确定这就是我所追求的。我已经更新了这个问题,以更清楚地说明我想要实现的目标。
    • 鉴于更新似乎缺少的是类之前的注释@Entity
    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 2012-09-20
    • 2019-06-12
    • 2012-06-23
    • 2010-09-09
    • 2011-03-26
    • 1970-01-01
    • 2015-06-24
    相关资源
    最近更新 更多