Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种方法可以在使用SpringDataJPA的查询中使用列名作为参数?_Java_Spring Data Jpa_Spring Data - Fatal编程技术网

Java 有没有一种方法可以在使用SpringDataJPA的查询中使用列名作为参数?

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

我正在写一个NBA统计数据可视化的应用程序。我使用的是SpringBoot+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();
}

您可以使用投影:

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 {
}