JPA:将JSON数组映射到DTO

时间:2020-11-01 21:45:27

标签: java sql hibernate jpa

我正在尝试从Query响应中创建单个JSON对象,该对象从两个表(会话和用户)中获得两行。但是出现以下错误:SQL错误:936,SQLState:42000。我正在使用Oracle数据库。

这是有效的JSON响应,我需要将其转换为单个JSON对象:

JSON:

[{"id":999,"name":John"},
{"id":999,"name":Peter"}]

查询:

@Query("SELECT new DTO.KaytDto(s.id, u.name) "
            + "FROM Session s INNER JOIN s.users u WHERE s.id=999")

现在我需要将JSON打印为以下内容:

[{
    "Id": "999",
    "Names":
        [{"name" : "John"}, 
        {"name" : "Peter"}]
}]

我试图将Set添加到我的DTO类构造函数中,但是当执行以下查询时,我得到了Whitelabel错误页面:500和Oracle错误代码。 当我在Oracle SQL Developer中尝试该查询时,从查询中形成的Hibernate sql查询将起作用。

有什么想法我做错了什么,或者如何获得想要的JSON打印?

使用一组用户对象进行查询:

@Query("SELECT new DTO.KaytDto(e.id, e.userSet) "
            + "FROM Session e INNER JOIN e.userSet d WHERE e.id=999")

DTO类:

public class KaytDto {
    
    private Long Id;
    private Set<User> userSet;

    public KaytDto(Long Id, Set<User> userSet) {
        this.Id = Id;
        this.userSet = userSet;

    }

//setters/getters

  @Override
    public String toString() {
        return "KaytDto [users=" + userSet + ", id=" + Id + "]";
    }
}

会话实体被映射到具有一对多关系的用户实体:

@Entity
@Table(name = "session")
public class Session {

    @Id
    @Column(name = "id", nullable = false)
    private long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "session")
    private Set<User> userSet;

   public Session() {

    }
 }

用户实体被映射到具有多对一关系的会话:

@Entity
@Table(name = "user")
public class User implements Serializable {
    
    private static final long serialVersionUID = 1L;

    @Column(name = "name")
    private String name;
    
    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "session_id", nullable = false)
    @Fetch(FetchMode.JOIN)
    private Session Session;
    
    public User(String name) {
        this.name = name;
    }
}

0 个答案:

没有答案