gpt4 book ai didi

java - 在 Hibernate 中获取列表列表

转载 作者:搜寻专家 更新时间:2023-11-01 02:09:29 25 4
gpt4 key购买 nike

在我的项目中,我有两个实体:RaceRaceDriver,其中有一个 Race:

class RaceDriver {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "race", nullable = false)
private Race race;
...
@Column(name = "starting_nr")
private Integer startingNr;
...
@Column(name = "disqualified", nullable = false)
private boolean disqualified;
}

现在,我想要的是在 Race< 中获取 disqualified RaceDriverstartingNr 列表,看起来像这样:

public List<Integer> findDisqualifiedDriversStartingNumbers(Integer raceId) {
ProjectionList projection = Projections.projectionList()
.add(Projections.property("startingNr").as("startingNr"));

return getSession()
.createCriteria(RaceDriver.class)
.setProjection(projection)
.add(Restrictions.eq("race.id", raceId))
.add(Restrictions.eq("disqualified", true))
.list();
}

问题是现在我需要同样的东西,但为少数 比赛。我如何在不进行单独的 DAO 调用的情况下实现这一点?因为我听说最好在单个数据库调用中尽可能多地进行。

我的想法是简单地获取在给定比赛中被取消资格的车手列表,然后在 Java 代码中解析它,我认为这将需要很少的循环,并制作一些被取消资格的 map RaceDriver 的起始号码,其中的键是 Race.id

DAO 尝试看起来像这样:

public List<RaceDriver> findDisqualifiedDriversInRaces(List<Integer> raceIds) {

return getSession()
.createCriteria(RaceDriver.class)
.add(Restrictions.in("race.id", raceIds))
.add(Restrictions.eq("disqualified", true))
.list();
}

问题是我会得到那么大的对象,而不是一些 map 或我需要的唯一数据列表(startingNrrace.id)。

所以问题是 - 我可以仅使用 Hibernate 以某种方式做到这一点吗?

最佳答案

就我个人而言,我会使用纯 Java 中的解决方案,因为对于将来支持您的代码的任何开发人员来说,它会更加清晰。

回答“可以通过 Hibernate 完成吗?”这个问题:是的,可以,ResultTransformer是正确的方法,特别是如果在您的程序中不止一次需要列表映射转换。没有满足您需求的标准转换器,但您可以编写自己的转换器:

public class MapOfListsResultTransformer<K, V> extends BasicTransformerAdapter {

public List transformList(List collection) {
final Map<K, List<V>> map = new HashMap<>();

for (Object object : collection) {
final Object[] objects = (Object[]) object;
final K key = (K) objects[0];
final V value = (V) objects[1];
if (!map.containsKey(key)) {
final List<V> list = new ArrayList<V>();
list.add(value);
map.put(key, list);
} else {
map.get(key).add(value);
}
}

return Arrays.asList(map);
}
}

它的用法如下:

public Map<Integer, List<Integer>> findDisqualifiedDriversInRaces(List<Integer> raceIds) {
ProjectionList projection = Projections.projectionList()
.add(Projections.property("race.id").as("race.id"))
.add(Projections.property("startingNr").as("startingNr"));

return (Map<Integer, List<Integer>>) getSession()
.createCriteria(RaceDriver.class)
.setProjection(projection)
.add(Restrictions.in("race.id", raceIds))
.add(Restrictions.eq("disqualified", true))
.setResultTransformer(new MapOfListsResultTransformer<Integer, Integer>())
.uniqueResult();
}

关于java - 在 Hibernate 中获取列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21096412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com