您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Spring Boot,Hibernate中使用@Query注释以JSON格式(键值对)查询结果

在Spring Boot,Hibernate中使用@Query注释以JSON格式(键值对)查询结果

您实际上正在使用选择进行投影,该选择不返回任何特定对象,而是返回 一个元组元组 是您在查询中选择的对象数组。无论采用哪种方式制作JSON,都没有名称,只有值。

您需要创建一个DTO来保存要通过JSON中的名称传递的值。

一个最小的示例,具有一个简单的实体,例如:

@Entity
@Getter
@requiredArgsConstructor
public class TestClass {
    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String a,b,c;
}

并愿意通过-例如-仅ab可能会有DTO,例如:

@requiredArgsConstructor
public class TupleDto {
    @NonNull
    private String a,b;
}

在你的情况下 PriceListDetailsDto

仓库可以这样声明:

public interface TestClassRepository extends CrudRepository<TestClass, Long> {

    @Query(value="SELECT new org.example.TupleDto(tc.a, tc.b) FROM TestClass tc")
    List<TupleDto> fetchAB();

}

:在上面,使用了操作符new和实体构造函数的完整路径。

这样,Spring存储库就知道如何分配选定的字段,并且当从此DTO生成JSON时,将导致具有带有名称(DTO中的名称)的字段。

newJPQL中的运算符只是newa,b,cjava中调用,因此任何行数据都可以用于构造Java对象,而该对象的类构造函数接受相同的参数数量和类型(并以相同的顺序)so liie new MyEntityObject(a,b,c)

在这种简单情况下,如果原始实体被修改为在c中允许空值并添加相应的构造函数,则可以将其用作DTO。如果您的元组是由许多表构成的,则需要创建一个DTO来保存这些值。

Java 2022/1/1 18:16:31 有547人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶