任何人都知道如何使用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;
...
答案 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()