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"
}
}
]
}
}
]
}