Java 基于第一个元素中的属性筛选JPA实体链的最后一个元素

Java 基于第一个元素中的属性筛选JPA实体链的最后一个元素,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我试着把它缩短到我能想到的最小的例子。在我的例子中,我得到了一个州内各个城市的商店位置。一家商店可以有很多水果。一种水果可以在许多商店出售。一个水果可以在多个州销售,每个州都有一定的成本。一个州可以结出许多果实 我有五个实体:州、商店、商店水果、水果和州水果,如下所示: @Entity @Table(name = "STATE") public class State { @Id @GeneratedValue(strategy = GenerationTy

我试着把它缩短到我能想到的最小的例子。在我的例子中,我得到了一个州内各个城市的商店位置。一家商店可以有很多水果。一种水果可以在许多商店出售。一个水果可以在多个州销售,每个州都有一定的成本。一个州可以结出许多果实

我有五个实体:州、商店、商店水果、水果和州水果,如下所示:

@Entity
@Table(name = "STATE")
public class State {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STATE_ID")
    private Integer stateId;
    @Column(name = "STATE_CD")
    private String stateCd;
    @OneToMany(mappedBy = "state")
    private Set<StateFruit> stateFruits;
    @OneToMany(mappedBy = "state")
    private Set<Store> stores;

    public State() {}

    @JsonIgnore
    public Integer getStateId() {
        return stateId;
    }

    public void setStateId(Integer stateId) {
        this.stateId = stateId;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("code")
    public String getStateCd() {
        return stateCd;
    }

    public void setStateCd(String stateCd) {
        this.stateCd = stateCd;
    }

    @JsonIgnore
    public Set<StateFruit> getStateFruits() {
        return stateFruits;
    }

    public void setStateFruits(Set<StateFruit> stateFruits) {
        this.stateFruits = stateFruits;
    }

    @JsonIgnore
    public Set<Store> getStores() {
        return stores;
    }

    public void setStores(Set<Store> stores) {
        this.stores = stores;
    }
}
现在,当我在存储库中搜索存储id时,我得到了以下JSON输出(使用JsonView):


这一切都按照我的预期进行,除了我想找到一些方法来过滤水果部分设置的状态,直到我正在查看的商店的状态。因为商店在州与州之间绕圈,我想我可以利用这种关系,我只是还没有遇到过这样的事情。不必编写自定义查询就可以实现这一点吗?

d您可以尝试标准规范吗?它会解决你的问题。如果你需要帮助,请告诉我example@SridharPatnaik我不熟悉这个,所以我没有。如果你有一个很好的例子,那么我也会在我这边做一些搜索。我想是的。不管怎么说,关于规格,有很多答案。规范是一个库,它可以根据任何可能的条件过滤数据。例如,在您的案例中,您可以根据需求创建规范对象,然后使用该对象获取数据。样品-
@Entity
@Table(name = "STORE")
public class Store {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STORE_ID")
    private Integer storeId;
    @Column(name = "STORE_CITY")
    private String storeCity;
    @OneToMany(mappedBy = "store")
    private Set<StoreFruit> storeFruits;
    @ManyToOne
    @JoinColumn(name = "state_id")
    private State state;

    public Store() {}

    @JsonIgnore
    public Integer getStoreId() {
        return storeId;
    }

    public void setStoreId(Integer storeId) {
        this.storeId = storeId;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("city")
    public String getStoreCity() {
        return storeCity;
    }

    public void setStoreCity(String storeCity) {
        this.storeCity = storeCity;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("fruits")
    public Set<StoreFruit> getStoreFruits() {
        return storeFruits;
    }

    public void setStoreFruits(Set<StoreFruit> storeFruits) {
        this.storeFruits = storeFruits;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("state")
    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}
@Entity
@Table(name = "STORE_FRUIT")
public class StoreFruit {

    @EmbeddedId
    private StoreFruitId storeFruitId;
    @ManyToOne
    @JoinColumn(name = "STORE_ID", insertable = false, updatable = false)
    private Store store;
    @ManyToOne
    @JoinColumn(name = "FRUIT_ID", insertable = false, updatable = false)
    private Fruit fruit;

    public StoreFruit() {}

    @JsonIgnore
    public StoreFruitId getStoreFruitId() {
        return storeFruitId;
    }

    public void setStoreFruitId(StoreFruitId storeFruitId) {
        this.storeFruitId = storeFruitId;
    }

    @JsonIgnore
    public Store getStore() {
        return store;
    }

    public void setStore(Store store) {
        this.store = store;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("fruit")
    public Fruit getFruit() {
        return fruit;
    }

    public void setFruit(Fruit fruit) {
        this.fruit = fruit;
    }
}
@Entity
@Table(name = "FRUIT")
public class Fruit {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "FRUIT_ID")
    private Integer fruitId;
    @Column(name = "FRUIT_NAME")
    private String fruitName;
    @OneToMany(mappedBy = "fruit")
    private Set<StoreFruit> storeFruits;
    @OneToMany(mappedBy = "fruit")
    private Set<StateFruit> stateFruits;

    public Fruit() {}

    @JsonIgnore
    public Integer getFruitId() {
        return fruitId;
    }

    public void setFruitId(Integer fruitId) {
        this.fruitId = fruitId;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("name")
    public String getFruitName() {
        return fruitName;
    }

    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }

    @JsonIgnore
    public Set<StoreFruit> getStoreFruits() {
        return storeFruits;
    }

    public void setStoreFruits(Set<StoreFruit> storeFruits) {
        this.storeFruits = storeFruits;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("states")
    public Set<StateFruit> getStateFruits() {
        return stateFruits;
    }

    public void setStateFruits(Set<StateFruit> stateFruits) {
        this.stateFruits = stateFruits;
    }
}
@Entity
@Table(name = "STATE_FRUIT")
public class StateFruit {

    @EmbeddedId
    private StateFruitId stateFruitId;
    @Column(name = "FRUIT_COST")
    private Double fruitCost;
    @ManyToOne
    @JoinColumn(name = "STATE_ID", insertable = false, updatable = false)
    private State state;
    @ManyToOne
    @JoinColumn(name = "FRUIT_ID", insertable = false, updatable = false)
    private Fruit fruit;

    public StateFruit() {}

    @JsonIgnore
    public StateFruitId getStateFruitId() {
        return stateFruitId;
    }

    public void setStateFruitId(StateFruitId stateFruitId) {
        this.stateFruitId = stateFruitId;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("cost")
    public Double getFruitCost() {
        return fruitCost;
    }

    public void setFruitCost(Double fruitCost) {
        this.fruitCost = fruitCost;
    }

    @JsonView(Views.Info.class)
    @JsonGetter("state")
    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    @JsonIgnore
    public Fruit getFruit() {
        return fruit;
    }

    public void setFruit(Fruit fruit) {
        this.fruit = fruit;
    }
}
{
    "city": "Fort Worth",
    "state": {
        "code": "TX"
    },
    "fruits": [
        {
            "fruit": {
                "name": "Apple",
                "states": [
                    {
                        "cost": 1.75,
                        "state": {
                            "code": "CO"
                        }
                    },
                    {
                        "cost": 1.5,
                        "state": {
                            "code": "TX"
                        }
                    }
                ]
            }
        },
        {
            "fruit": {
                "name": "Banana",
                "states": [
                    {
                        "cost": 2.25,
                        "state": {
                            "code": "CO"
                        }
                    },
                    {
                        "cost": 2.0,
                        "state": {
                            "code": "TX"
                        }
                    }
                ]
            }
        }
    ]
}