簡體   English   中英

使用 JSON_EXTRACT 從 JSON 中獲取值 Spring JPA 自定義 DTO 的自定義查詢

[英]Use JSON_EXTRACT to get value from JSON in Spring JPA Custom Query for custom DTO

我想從 JSON 列中獲取值並在 spring JPA 中返回自定義 DTO。

表結構

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

meta列包含年齡,例如{"age": "45"}

我想獲取具有idnameage的用戶列表。 由於數據可能很大,我創建了一個自定義 DTO UserDataDto

以下是相同的示例:

@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);

User實體:

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

  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 Integer age;

}

UserDataDto結構:

public class UserDataDto {
  private Long userId;
  private String name;
  private Integer age;
}

在啟動 spring 啟動應用程序時,我得到

警告 | 上下文初始化期間遇到異常 - 取消刷新嘗試:org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userRepo': Invocation of init method failed; 嵌套異常是 java.lang.IllegalArgumentException:查詢方法 public abstract java.util.List com.db.UserRepo.findUsersByIdIn(List<java.lang.Long>) 的查詢驗證失敗!

我能想出的唯一解決方案是使用本機查詢,非常感謝任何其他解決方案。

我能想出的唯一解決方案是使用@NamedNativeQuery@SqlResultSetMapping

User實體中

@Data
@Table(name = "user")
@Entity
@NamedNativeQuery(
  name = "findUsersByIdIn",
  query = "SELECT userId, name, meta->>'$.age' as age " +
    "FROM user " +
    "WHERE user_id = :userIds",
  resultSetMapping = "UserDataDto"
)
@SqlResultSetMapping(
  name = "UserDataDto",
  classes = @ConstructorResult(
    targetClass = UserDataDto.class,
    columns = {
      @ColumnResult(name = "userId", 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM