gpt4 book ai didi

java - 有没有办法在使用 Spring Data JPA 的查询中使用列名作为参数?

转载 作者:行者123 更新时间:2023-12-05 07:14:39 24 4
gpt4 key购买 nike

我正在编写一个 NBA 统计数据可视化应用程序。我正在使用 Spring Boot + MySql 数据库。我试图从每列中找到最小最大 值,条件是玩家必须至少玩 10 场比赛。为此,我可以编写如下方法:

@Repository
public interface PerGameStatsRepository extends JpaRepository<PerGameStats, PerGameStatsId> {

@Query(value = "SELECT MAX(stats.pts) FROM PerGameStats stats WHERE stats.gamesPlayed >= 10")
BigDecimal findMaxAmountOfPoints();

@Query(value = "SELECT MIN(stats.pts) FROM PerGameStats stats WHERE stats.gamesPlayed >= 10")
BigDecimal findMinAmountOfPoints();
}

但是,该表有大约 15 列,例如得分、篮板、助攻、盖帽等(可能我会添加更多)。为了获得每个列的最小值和最大值,我必须为每一列编写 2 个方法:总共 2x15 = 30。有没有办法避免这种重复并编写一个将列名作为参数并基于它执行正确查询的方法?像这样的东西:

// this obviously doesn't work
@Query(value = "SELECT MAX(stats.:#{#fieldName}) FROM PerGameStats stats WHERE stats.gamesPlayed >= 10")
BigDecimal findMaxAmountOfField(String fieldName);

最佳答案

对于这种情况,您必须创建一个 custom repository implementation .这样的事情应该有效:

interface CustomizedPerGameStatsRepository {
BigDecimal findMaxAmountOfField(String fieldName);
}

通过以下实现:

class CustomizedPerGameStatsRepositoryImpl implements CustomizedPerGameStatsRepository { // name has to be ...Impl

private final EntityManager em;

@Autowired
public CustomizedPerGameStatsRepositoryImpl(JpaContext context) {
this.em = context.getEntityManagerByManagedType(PerGameStats.class);
}

public BigDecimal findMaxAmountOfField(String fieldName) {
return (BigDecimal) em.createQuery("SELECT MAX(" + fieldName + ") FROM PerGameStats stats WHERE stats.gamesPlayed >= 10")
.getSingleResult();
}
}

以及您存储库中的更改:

@Repository
public interface PerGameStatsRepository extends JpaRepository<PerGameStats, PerGameStatsId>, CustomizedPerGameStatsRepository {
}

关于java - 有没有办法在使用 Spring Data JPA 的查询中使用列名作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59814299/

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