Java Spring数据存储库按列分组,包含其他列的对象列表

Java Spring数据存储库按列分组,包含其他列的对象列表,java,jpa,spring-data,jpql,spring-repositories,Java,Jpa,Spring Data,Jpql,Spring Repositories,如何让Spring存储库返回一个自定义DTS,该DTS按表中的列businessValue1分组,并具有一个DTO对象列表和表中的其他列 @Data @AllArgsConstructor @Entity public class SomeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @NotNull private long id; @NotNull private String

如何让Spring存储库返回一个自定义DTS,该DTS按表中的列businessValue1分组,并具有一个DTO对象列表和表中的其他列

@Data
@AllArgsConstructor
@Entity
public class SomeEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @NotNull
  private long id;
  
  @NotNull
  private String businessValue1;
  
  @NotNull
  private String businessValue2;
  
  @NotNull
  private String businessValue3;
}
@Data
@AllArgsConstructor
public class SomeDTO {

  private String businessValue2;
  
  private String businessValue3;
}
要从中返回DTS的表

id | businessValue1 | businessValue2 | businessValue3
1  | "x"            | "uigaiun"      | "guthgi"
2  | "x"            | "rktjuhngit"   | "ujgthniuertn"
3  | "x"            | "nguitren"     | "ikljugnbe"
4  | "y"            | "iughnuitn"    | "eiubgnuie"
5  | "q"            | "rtiluhn"      | "iljughbl"
6  | "q"            | "tkiruln"      | "jutgnhet"
表示表的Java实体类

@Data
@AllArgsConstructor
@Entity
public class SomeEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @NotNull
  private long id;
  
  @NotNull
  private String businessValue1;
  
  @NotNull
  private String businessValue2;
  
  @NotNull
  private String businessValue3;
}
@Data
@AllArgsConstructor
public class SomeDTO {

  private String businessValue2;
  
  private String businessValue3;
}
目标类别:

表中其他列的DTO表示

@Data
@AllArgsConstructor
@Entity
public class SomeEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @NotNull
  private long id;
  
  @NotNull
  private String businessValue1;
  
  @NotNull
  private String businessValue2;
  
  @NotNull
  private String businessValue3;
}
@Data
@AllArgsConstructor
public class SomeDTO {

  private String businessValue2;
  
  private String businessValue3;
}
DTS表示列businessValue1的group by,其他列表示DTO列表

@Data
@AllArgsConstructor
public class SomeDTS {

  private String businessValue1;
  
  private List<SomeDTO> dtos;
}
我认为Spring数据存储库界面应该如下所示

├── "x"
|    ├── "uigaiun", "guthgi"
|    ├── "rktjuhngit", "ujgthniuertn"
|    └── "nguitren", "ikljugnbe"
|
├── "y"
|    └── "iughnuitn", "eiubgnuie"
|
└── "q"
     ├── "rtiluhn", "iljughbl"
     └── "tkiruln", "jutgnhet"
@Repository
public interface SomeEntityRepository extends JpaRepository<SomeEntity, Long> {

  @Query(
      "SELECT "
      +  "new SomeDTS "
      +"FROM "
      +  "SomeEntity s "
      +"GROUP BY "
      +  "s.businessValue1")
  public List<SomeDTS> SomeEntityGroupByBusinessValue1();

}
那么如何进行映射呢

更新2 改为切换到接口

@Repository
public interface SomeEntityRepository extends JpaRepository<SomeEntity, Long> {

  @Query(value =
      "SELECT "+
          " DISTINCT SomeDTSIF.businessValue1 as businessValue1, SomeDTOIF" +
          " FROM SomeEntity AS SomeDTSIF" +
          " JOIN SomeEntity AS SomeDTOIF ON SomeDTSIF.businessValue1 = SomeDTO.businessValue1")
  Stream<SomeDTSIF> SomeEntityGroupByBusinessValue1();

}
SomeDTSIF中的SomeDTOIF列表没有被映射。

我最终创建了一个“虚拟”父实体,它的行为有点像视图

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
@EqualsAndHashCode
@Immutable
@Subselect(
    "SELECT"
        + " DISTINCT SomeEntityParent.currency_source "
        + " FROM some_entity SomeEntityParent"
        + " JOIN some_entity SomeEntity"
        + " ON SomeEntityParent.businessValue1 = SomeEntityParent.businessValue1"
)
public class SomeEntityParent {

  private String businessValue1;
  
  private List<SomeEntity> someEntity;
}
@数据
@AllArgsConstructor
@诺尔格构装师
@托斯特林
@实体
@EqualsAndHashCode
@不变的
@再选择(
“选择”
+“不同的SomeEntityParent.currency\u来源”
+“从某个实体到某个实体”
+“加入某个实体某个实体”
+“在SomeEntityParent.businessValue1=SomeEntityParent.businessValue1上”
)
公共类sometentityparent{
私人企业价值1;
私有实体;
}
然后是基于此的存储库接口

@Repository
public interface SomeEntityParentRepository extends JpaRepository<SomeEntityParent, Long> {

}
@存储库
公共接口SomeEntityParentRepository扩展了JpaRepository{
}
然后可以在服务中使用

@Autowired
private SomeEntityParentRepository repository;
  
List<SomeEntityParent> results = repository.findAll();
@Autowired
私有somentityparentrepository存储库;
List results=repository.findAll();

平面结构现在是一个分层对象。

您应该查看
投影
,或者在两个
Dts
中添加一些映射信息。谢谢您,我已经尝试搜索过这样的投影是谁完成的,没有任何运气。。。一旦我找到了,不要真的涵盖我正在尝试的东西:壁橱似乎是你能指出一些指南吗。