当前位置: 首页 > 知识库问答 >
问题:

使用JSON_EXTRACT从自定义DTO的Spring JPA自定义查询中的JSON获取值

任伟
2023-03-14

我想从JSON列中获取值,并在spring JPA中返回自定义DTO。

表结构

userId (int)
name (string)
street (string)
zipcode (string)
state (string)
country (string)
meta (JSON)

meta列包含年龄,例如{“年龄”:“45”}

我想获取具有idnameage的用户列表。由于数据量可能很大,我创建了一个自定义DTOUserDataDto

下面是一个同样的例子:

@Query("SELECT new com.model.UserDataDto(userId, name, FUNCTION('JSON_EXTRACT', meta, '$.age')) " +
    "FROM User " +
    "WHERE userId IN (:userIds) ")
  List<UserDataDto> findUsersByIdIn(@Param("userIds") List<Long> userIds);

用户实体:

@Data
@Table(name = "user")
@Entity
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;
  private String street;
  private String zipcode;
  private String state;
  private String country;

  @NotNull
  @Convert(converter = UserMetaConverter.class)
  private UserMeta meta;

}

UserMeta结构:

@Data
public class UserMeta {

  private Long age;

}

UserDataDto结构:

public class UserDataDto {
  private Long id;
  private String name;
  private Integer previousId;
}

启动Spring启动应用程序

警告|上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂UnsatifiedPendencyException:创建名为“userRepo”的bean时出错:调用init方法失败;嵌套的例外是java。lang.IllegalArgumentException:方法公共抽象java的查询验证失败。util。列出com。db。UserRepo。findUsersByIdIn(列表

我能想到的唯一解决方案是使用本地查询,任何其他解决方案都非常受欢迎。

共有1个答案

庄阿苏
2023-03-14

我能想出的唯一解决方案是使用@namednaviquery@SqlResultSetMapping

用户实体

@Data
@Table(name = "user")
@Entity
@NamedNativeQuery(
  name = "findUsersByIdIn",
  query = "SELECT user_id, name, meta->>'$.age' as age " +
    "FROM user " +
    "WHERE user_id = :userIds",
  resultSetMapping = "UserDataDto"
)
@SqlResultSetMapping(
  name = "UserDataDto",
  classes = @ConstructorResult(
    targetClass = UserDataDto.class,
    columns = {
      @ColumnResult(name = "id", type = Long.class),
      @ColumnResult(name = "name", type = String.class),
      @ColumnResult(name = "age", type = Integer.class)
    }
  )
)
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;
  private String street;
  private String zipcode;
  private String state;
  private String country;

  @NotNull
  @Convert(converter = UserMetaConverter.class)
  private UserMeta meta;

}

存储库中

public interface UserRepo extends JpaRepository<User, Long> {

  @Query("findUsersByIdIn", nativeQuery = true)
  List<UserDataDto> findUsersByIdIn(@Param("userIds") List<Long> userIds);
}
 类似资料:
  • 问题内容: 我试图在扩展CrudRepository的存储库中执行一些SQL查询。我在控制器中有以下代码: DAO代码如下: 该类是: 投影为: 我对如何添加查询(诸如此类)感到困惑: 我如何更改投影,还有哪些其他必要的更改? 问题答案: 您可以将DAO更改为下面,这应该可以工作。 } 确保Bean类构造函数应具有传递的参数。 验证查询是否为有效的JPA查询(此处)。

  • 1. 简介 分析云作为企业进行全域用户行为数据分析的数据中台,需要满足企业不同业务角色的各类差异化分析需求。 其中,对于企业深度结合业务模式的定制化需求,分析云平台提供了“自定义SQL查询”的功能,支持业务人员自行编辑复杂的 SQL 查询语言,实现对平台数据仓库中最底层的细粒度用户行为数据进行分析操作,以获取当前分析云平台既有数据模型无法覆盖的个性化分析需求的结果。 2. 使用说明 当前 sql

  • 我一直在建立一个自定义搜索。该搜索具有许多下拉列表,用户可以将其留空,也可以从许多选项中进行选择。此数据保存在“wine note”自定义帖子类型的帖子中的自定义字段中。 到目前为止,它在某种程度上起了作用。我的搜索结果页面如下所示: 问题是,即使下拉选择器为空,搜索也会排除没有该特定自定义字段的任何帖子。 仅显示所有自定义字段(数据或非数据)的帖子。 因此,我稍微修改了我的代码,添加了一些if语

  • 我对GraphQL,Appsync和放大器非常陌生。我使用AWS AppSync与放大器通过GraphQL查询从DynamoDB表获取记录。前端在ReactJS中。看看aws文档上的一些例子,我似乎可以用JSON格式获取记录,就像它存储在表中一样。我想找到一些留档或示例,说明如何迭代返回的记录集,并在返回的数据发送回客户端之前对其执行一些计算。但是我无法将在线留档与我想要实现的目标联系起来。 例如

  • 我是Elasticsearch的新手,所以我怀疑: 我在弹性搜索中插入了大量数据。我插入的数据包含每个科目的分数属性,是否可以编写Elasticsearch查询来查找分数在输入范围内的学生人数 例子: 假设以表格方式存在于ES中的数据,是否有可能 1.找到计算机成绩超过50分的学生名单。 2、查找两门科目得分均超过60分的学生名单。

  • 我在这里创建了一个类似于教程的Web应用程序:https://spring.io/guides/tutorials/react-and-spring-data-rest/ . 我已经添加了后gresql数据库,一切正常。我有一个基本查询查找我的存储库中的By用户名(字符串名称),工作正常。我的问题是,由于某种原因我无法创建自定义查询,例如 . 假设我做了一个测试,我只想得到这个语句的值。我说的不能