我目前在一个大学项目中首次体验了 JAVA SpringBoot,其中我们使用 H2 in-mem 数据库进行存储。对于统计,我想使用自定义查询来获取数据 - 这工作得很好。然而,当开始处理返回的数据时,我遇到了很多问题并且需要帮助。
我的查询返回 4 列(名称、avgTasteRating、avgDesignRating、avgPriceRating)。为了解析 Java 中的信息,我构建了一个由相同列组成的自定义实体 (WineDTO)。然而,只有名称被解析 - 由于某种原因,其余部分被转换为“null”..
有人对可能的错误或修复有任何想法吗?不胜感激!非常感谢你!!!
WineRepository.java
@Query(value =
"SELECT w.NAME, AVG(r.taste_rating) AS avgTasteRating, AVG(r.design_rating) AS avgDesignRating,AVG(r.price_rating) AS avgPriceRating" +
" FROM WINE w JOIN RATING r ON w.ID = r.wine_id" +
" GROUP BY w.ID, w.NAME" +
" ORDER BY avgTasteRating DESC", nativeQuery = true)
List<WineDTO> findWinesWithAverageRatings();
WineDTO.java
@Entity
public class WineDTO {
private String name;
private String avgTasteRating;
private String avgDesignRating;
private String avgPriceRating;
@Id
private Long id;
// constructer, set and get to follow
使用 Spring Data JPA 投影接口而不是实体,您需要定义一个投影接口,其中包含您要选择的字段。这是一个例子:
投影接口:
public interface WineDTO {
String getName();
Double getAvgTasteRating();
Double getAvgDesignRating();
Double getAvgPriceRating();
Long getId();
}
在此界面中,方法名称应与您在查询中选择的字段名称相匹配。
JPA 存储库:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface WineRepository extends JpaRepository<Wine, Long> {
@Query(value =
"SELECT w.NAME, AVG(r.taste_rating) AS avgTasteRating, AVG(r.design_rating) AS avgDesignRating, AVG(r.price_rating) AS avgPriceRating" +
" FROM WINE w JOIN RATING r ON w.ID = r.wine_id" +
" GROUP BY w.ID, w.NAME" +
" ORDER BY avgTasteRating DESC", nativeQuery = true)
List<WineDTO> findWinesWithAverageRatings();
}
确保存储库中的方法返回已定义投影接口的列表(在本例中为
WineDTO
)。
请记住,Spring Data JPA 会根据名称将本机查询的结果映射到投影接口中的字段,因此接口中的名称应与本机查询中的别名匹配。
如果您想了解有关 Spring Data JPA Projections 的更多信息,请查看此处的官方文档 - https://docs.spring.io/spring-data/jpa/reference/repositories/projections.html