当前位置: 首页 > 知识库问答 >
问题:

对于与数据实体具有多对1关系的JPA实体,如何根据数据实体的方法调用结果对对象列表进行排序?

陆宝
2023-03-14

我有一个JPA实体用户,它包含一个与UserStats实体的OneToMany关系。我重构了现有代码,以使用这个新的UserStats实体,并在之前管理与胜利率相关的特性,我将胜利率作为属性存储在用户实体中。

然而,我认为最好是让一个方法返回victoryRatio,因此CalculativeCoryRatio()被实现到UserDetails实体中。

这导致了一些问题,例如,我在UserRepo中有一个repository方法:

List<User> findAllByOrderByVictoryRatioDesc();

我不能再直接在repo中搜索它,因为victoryRatio()方法位于User实体的UserStats中,而且我认为您无论如何都不能在repo方法中调用方法?

所以我现在尝试在userService中做,但无法弄清楚:

public List<User> getBestVSUsers() {

    List<User> users = userRepository.findAll();
    for (User user: users
         ) {
        user.getUserStats().get(0).calculateVictoryRatio();
    }

}

但是,我需要对上面的列表进行排序的基础上的计算结果Victoria yRatio().

在我的React前端中,我还呈现了以下内容:

   const topUserList = users.map(user => {
            return <tr key={user.id}>
                <td style={{ whiteSpace: 'nowrap' }} class="player-list-key-text">{user.name}</td>
                <td className="player-list-key-text">{user.username}</td>
                <td className="player-list-key-text"><span className="defeats">{user.victories}</span></td>
                <td className="player-list-key-text"><span className="victories">{user.defeats}</span></td>
                <td className="player-list-key-text"><span className="victory-score">{user.victoryRatio}</span></td>
            </tr>
        });

现在,胜利比、失败和胜利都封装在UserStats实体中,我如何才能像上面那样呈现它们?我需要单独提取并合并2吗?或者我可以这样做:

{user.user统计[0]。胜利}

如何做到这一点?有更好的方法吗?我可以在userRepo中调用方法吗?

谢谢你的帮助

共有2个答案

冉弘化
2023-03-14

只要在查询中加入相关实体,就可以对该实体进行订购。您可能需要在存储库中定义自定义查询。

@Query("SELECT u from User u JOIN u.userStats us ORDER BY us.victoryRatio")
List<User> findAllCustomSort();

然而,很明显,数据库引擎在这里独立于代码进行排序。您尚未向我们显示CalculateCurvatory方法的内容,但如果您必须根据在代码中执行的计算进行排序,则无法正常工作。我对此表示怀疑,因为你只是在谈论将比率移动到另一个实体,而不是开始计算它。但如果是这样的话,你当然可以在内存中对列表进行排序。考虑到您没有使用分页,这也不会太糟糕。

或者如果您绝对必须在数据库中进行排序,那么我认为您别无选择,只能在数据库中为其创建一个自定义函数。不过,这有点超出了这个问题的范围。

能烨华
2023-03-14

试试这样的东西:

PageRequest pageRequest = new PageRequest(pageNumber, pageSize, new Sort(new Order(Direction.DESC, "ORDER BY (VICTORIES/DEFEATS)"))
Page page = myRepository.findAll(specification, pageRequest);

你可以把你的比率公式放在哪里。在这种情况下,我们将计算放在SGDB上。

 类似资料:
  • 我有一个JPA实体(人)与其他实体(地址)有多对一的关系。在一个对象可以被系统使用之前,这个对象必须得到主管的批准。我将原始实体存储为byte[]并对“工作”实体进行更改,并将其存储在数据库中。如果这些更改不被批准,我必须恢复原始状态。因此,我将存储的原始数据从byte[]中转换出来,并使用实体管理器将其合并到数据库中。所有的工作都很好,但是如果一个新的地址实体已经添加到“工作”的人,在合并还原的

  • 假设我有两个核心数据实体。一个学生实体和一个类实体。在这个例子中,一个学生正好在一个班级中,一个班级可以有很多学生。 我们也假设这些是大类。也就是说,每个班有1000名学生。 类实体如下所示: 和学生实体: 在我的UI中,我想显示一个类。我想显示有一定分数的学生人数。一、 对于一个1000名学生的班级,50名学生得了a,500名学生得了B,200名学生得了C,以此类推。 从核心数据中获取这些计数的

  • 我有一个实体CandidateTransaction和CandidateTransactionRepository扩展了CrudRepository 我正在使用CrudRepository的save方法来保存所述实体的对象。当实体没有行时,它将创建一个自动生成的键并将其插入ID列,而不需要Java端的干预。 而且,由于CrudRepository的save()方法检查实体是否是新的,如果是新的,它

  • 我有一个jpa实体,比如entityA和另一个实体,比如entityB,它们之间没有任何映射/关联。我想在更新或保存EntityA时对entityB执行一些JPQL或操作。例如,假设我保存了新的entityA,所以我想在entityB上运行一些自定义JPQL查询,或者由于新保存了entityA而从DB中删除entityB。我想使用EntityListener,但我不知道如何使用,因为我在myh自定

  • 问题内容: 有一个实体类“ A”。A类可能具有相同类型“ A”的子级。如果“ A”是孩子,则也应保留它的父母。 这可能吗?如果是这样,我应该如何在Entity类中映射关系?[“ A”有一个id列。] 问题答案: 是的,这是可能的。这是标准双向@ManyToOne/ @OneToMany关系的特例。之所以特别是因为关系两端的实体都是相同的。JPA 2.0规范的第2.10.2节详细介绍了一般情况。 这