【问题标题】:How to ignore @OneToMany relation for GET request?如何忽略 GET 请求的 @OneToMany 关系?
【发布时间】:2020-05-03 18:40:24
【问题描述】:

我有一个名为 Restaurant 的实体,它有另一个类的一组对象:

@Entity
@Table(name = "restaurants")
public class Restaurant extends AbstractNamedEntity implements Serializable {

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "restaurant")
    private Set<Meal> meals = Collections.emptySet();
    //getters, setters and other variables
}

“Meal”类与“Restaurant”有@ManyToOne 关系。

我有 Spring JPA 存储库:

@Repository
public interface RestaurantRepository extends CrudRepository<Restaurant, Integer> {
}

当我使用 findById() 方法时 - 我正在去一家餐厅用餐

我需要找一家没有任何餐点的餐厅。 Set 不能从存储库中获取 - 它应该被忽略 我该怎么做?

【问题讨论】:

    标签: java hibernate spring-boot spring-data-jpa spring-data


    【解决方案1】:

    您可以在属性上添加@JsonIgnore 注释,或创建一个仅包含模型所需属性的 DTO。

    【讨论】:

    • 据我所知 - Set 无论如何都会从存储库中获取,但视图会被忽略
    • 我需要忽略从存储库获取的数据中的该字段
    • 如果忽略它的意思是 DON'T NEED IT ,你可以使用一个 DTO 对象,它只包含你想要的属性。例如:MealModel mealModel = repository.findMeal(); MealDTO mealDTO = new MealDTO(); mealDTO.setAttribute(mealDTO.getAttribute()); mealDTO.setAttributeTwo(mealDTO.getAttributeTwo());
    • Set 不能从存储库中取出 - 它应该被忽略!
    • findById() 方法返回一个 Optional 类型,该类型最终将通过反射调用“getMeals()”方法,因此 Set 将被填充。尝试使用 findById().get() 而不是仅用于调试以查看结果。
    【解决方案2】:

    由于您的配置为:

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "restaurant")
    

    懒惰的意思是如果你不明确询问,数据将不会被获取。

    当您评估表达式并单击餐点时,它将执行查询(因为它会调用 get 方法),该查询将返回数据。 如果你打开 show_sql 标志,你可以试试这个:

    spring.jpa.show-sql=true
    

    补充,尽量不调试就返回数据。

    另外,使用 DTO 向客户端返回数据,不要使用@JsonIgnore,这是不好的做法(这是快速解决方案)

    【讨论】:

    • 是否可以在实体上不使用 Lazy 进行选择?如有特殊情况
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多