代码之家  ›  专栏  ›  技术社区  ›  Serhii

如何指定spring数据jpa请求来加载实体属性集合?

  •  1
  • Serhii  · 技术社区  · 8 年前

    我使用spring数据JPA。我需要在我的存储库请求中只加载具体属性的集合 颜色 :

    @Query(value = "SELECT cd.color FROM CalendarDetails cd where cd.userCalendar.userId = :userId")
    List<String> findCalendarColorsByUserWithDuplicates(@Param("userId") Long userId);
    

    提供的解决方案工作正常。

    我希望使用spring方法来加载我将使用的存储库对象的集合(存储库 public interface CalendarDetailsRepository extends JpaRepository<CalendarDetails, Long> ):

    List<CalendarDetails> findByUserCalendarUserId(@Param("userId") Long userId);
    

    但我需要收集颜色!尝试

    List<String> findColorByUserCalendarUserId(Long userId);
    

    我收集了 CalendarDetails

    在spring数据加载颜色列表的方法之后,是否有可能改进我的上一个请求?

    2 回复  |  直到 8 年前
        1
  •  2
  •   dvelopp    8 年前

    您可以尝试Spring数据提供的特殊投影机制。它不仅允许您优化查询,还允许您使用纯java进行优化,而无需使用@Query。

    有很多方法可以 make it ,但我建议如下。 您添加了一个接口,该接口包含需要从实体获取的属性的getter:

    public interface ColorOnly {
        String getColor();
    }
    

    然后返回此接口对象的列表:

    List<ColorOnly> findColorByUserCalendarUserId(Long userId);
    

    要使用界面中的颜色,只需调用getColor方法。您可以考虑使用Java 8流和映射转换来简化它。顺便说一句,这只会查询颜色。Hibernate生成的查询中不会包含其他字段。

        2
  •  -1
  •   reconnect    8 年前

    尝试添加 全部的

    findAllByUserCalendarUserId(Long userId);

    顺便说一句,IntelliJ IDEA对JPA存储库提供了非常深入的支持,因此当您创建这样的查询时,它可以防止许多可能的问题