作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 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/
我是一名优秀的程序员,十分优秀!