gpt4 book ai didi

Java spring忽略请求中的字段

转载 作者:行者123 更新时间:2023-12-02 09:23:32 26 4
gpt4 key购买 nike

我想创建一个包含两个实体的 REST 应用程序:BordBordRows,您可以猜到 Bord 有许多 BordRows。现在,我想要一个请求来获取除行关系之外的每个属性的所有边框,以及一个不同的请求来获取包含关系 Rows 的单个 Bord 。我对 Java spring 仍然很陌生,据我所知,使用更少的数据库查询来检索结果会更快,例如,如果我不需要它们来节省时间,则不要检索 Rows更快的结果。我用 @JsonIgnore 注释设置它来忽略关系,从而不从数据库中检索它们。我有一个带有 findAllgetByIdgetBordRows 的资源,用于检索特定请求中的行。我想要另一个请求通过 id 获取具有 rows

关系的 Bord

边界实体:

import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;

@Table(name = "bords")
@Entity
public class Bord
{
@Id
@GeneratedValue
private int id;

@NotNull
private String name;

@Column
private String icon;

@Column
private String background;

@OneToMany(mappedBy = "bord")
@JsonIgnore
private List<BordRow> rows;

public Bord()
{
rows = new ArrayList<>();
}

public int getId()
{
return id;
}

public void setId(int id)
{
this.id = id;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public String getIcon()
{
return icon;
}

public void setIcon(String icon)
{
this.icon = icon;
}

public String getBackground()
{
return background;
}

public void setBackground(String background)
{
this.background = background;
}

public void addRow(BordRow bordRow)
{
this.rows.add(bordRow);
}

public List<BordRow> getRows()
{
return rows;
}

public void setRows(List<BordRow> bordRows)
{
this.rows = bordRows;
}
}

BordRow 实体:

import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.*;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "bord_rows")
public class BordRow
{
@Id
@GeneratedValue
private int id;

@NotNull
private String title;

@ManyToOne
@JoinColumn(name = "bord_id")
@JsonIgnore
private Bord bord;

public int getId()
{
return id;
}

public void setId(int id)
{
this.id = id;
}

public String getTitle()
{
return title;
}

public void setTitle(String title)
{
this.title = title;
}

public Bord getBord()
{
return bord;
}

public void setBord(Bord bord)
{
this.bord = bord;
}
}

边界资源:

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping(path = "/bords")
public class BordResource
{
private final BordController bordController;

public BordResource(BordController bordController)
{
this.bordController = bordController;
}

@GetMapping
public List<Bord> getAll()
{
return bordController.findAll();
}

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Optional<Bord> getById(@PathVariable("id") int id)
{
return Optional.ofNullable(bordController.getById(id));
}

@RequestMapping(value = "/rows/{id}", method = RequestMethod.GET)
public List<BordRow> getBordRows(@PathVariable final int id)
{
Bord bord = bordController.getById(id);
return bordController.getBordRowsByBord(bord);
}
}

最佳答案

对于这种情况,必须采取两个步骤:

  1. 关联对象应延迟加载。
  2. API层可以有一些DTO对象用于传输数据业务层返回给客户端。

现在,Bord 和 BordRow 实体应该发生变化。

在博德:

@OneToMany(mappedBy = "bord", fetch = FetchType.LAZY)
@JsonIgnore
private List<BordRow> rows;

在 BordRows 中:

@ManyToOne
@JoinColumn(name = "bord_id", , fetch = FetchType.LAZY))
@JsonIgnore
private Bord bord;

通过应用这些更改,每当您查询数据库时,在显式调用关联对象之前都不会加载它们。为了更好地理解延迟加载,请查看 this_SO_thread .

对于第二步(可选),您可以声明一些 DTO 类,并将从业务层返回的对象映射到它们,并将它们传递给客户端。这些 DTO 类可以拥有您(作为开发人员)认为应该传输给客户端的属性。

例如:

class BordDto{
private String name;
private String icon;
private String background;
//getters and setters
}

class BordRowDto {
private String title;
//getters abs setters
}

在你的 Controller 中:

@GetMapping(value = "/bords")
public List<BordDto> handle() {

return bordService.findAll().stream
.map(SomeUtilToMapModelToDto::mapBordToBordDto)
.collect(Collectors.toList());

}

关于Java spring忽略请求中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58499671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com