Java 有没有一种方法可以在使用SpringDataJPA的查询中使用列名作为参数?
我正在写一个NBA统计数据可视化的应用程序。我使用的是SpringBoot+MySql数据库。我试图从每一列中找出最小的和最大的值,条件是一名球员必须至少打10场比赛。为此,我可以编写如下方法:Java 有没有一种方法可以在使用SpringDataJPA的查询中使用列名作为参数?,java,spring-data-jpa,spring-data,Java,Spring Data Jpa,Spring Data,我正在写一个NBA统计数据可视化的应用程序。我使用的是SpringBoot+MySql数据库。我试图从每一列中找出最小的和最大的值,条件是一名球员必须至少打10场比赛。为此,我可以编写如下方法: @Repository public interface PerGameStatsRepository extends JpaRepository<PerGameStats, PerGameStatsId> { @Query(value = "SELECT MAX(stats.pts) F
@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();
}
您可以使用投影:
interface MinMaxProjection {
BigDecimal getMin();
BigDecimal getMax();
}
那么您的存储库应该如下所示:
@Query(value = "SELECT MIN(stats.pts) as min, MAX(stats.pts) as max FROM PerGameStats stats WHERE stats.gamesPlayed >= 10")
MinMaxProjection findMinMaxAmountOfPoints();
}
那么你的回答应该是:
{
max: 460,
min: 200,
}
对于这种情况,您必须创建一个。像这样的方法应该会奏效:
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 {
}
@存储库
公共接口PerGameStatsRepository扩展了JpaRepository,自定义PerGameStatsRepository{
}
谢谢。您可以在答案中添加一个public
修饰符,该修饰符位于CustomizedPerGameStatsRepositoryImpl
中的BigDecimal findMaxAmountOfField(String fieldName)
声明中,因为默认类可见性是包私有的,并且与inteface的默认公共访问冲突。
@Repository
public interface PerGameStatsRepository extends JpaRepository<PerGameStats, PerGameStatsId>, CustomizedPerGameStatsRepository {
}