sto cercando di convertire questa query SQL prime:primavera dati registrazione con specifiche
select product.* from following_relationship
join product on following_relationship.following=product.owner_id
where following_relationship.owner=input
Into specifiche primavera dati, penso che il mio problema finora è per unirsi quei tavoli.
Ecco il mio attuale conversione in Specification:
protected Specification<Product> test(final User user){
return new Specification<Product>() {
@Override
public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Join<FollowingRelationship,Product> pfJoin = query.from(FollowingRelationship.class).join("following");
pfJoin.on(cb.equal(pfJoin.get("following"),"owner"));
return query.where(cb.equal(pfJoin.get("following"),user)).getGroupRestriction();
}
};
}
e sto ottenendo questa eccezione:
Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessA
piUsageException: org.hibernate.hql.internal.ast.InvalidWithClauseException: with clause can only reference columns in the driving table
mi piacerebbe aggiungere che io sono nuovo a framework Spring per esempio questo è la mia prima domanda in primavera, quindi le mie scuse per la domanda newbie;)
Modifica: aggiunto entità Prodotto, FollowingRelationShip
Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "json_id_prop")
public class FollowingRelationship extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "OWNER", referencedColumnName = "uuid")
private User owner;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FOLLOWING", referencedColumnName = "uuid")
private User following;
public User getOwner() {
return owner;
}
public void setOwner(User owner) {
this.owner = owner;
}
public User getFollowing() {
return following;
}
public void setFollowing(User following) {
this.following = following;
}
}
@Entity
@Table(name = "product")
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "json_id_prop")
public class Product extends BaseEntity {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "OWNER_ID", referencedColumnName = "uuid")
private User owner;
@NotNull
private String name;
@NotNull
private String description;
@NotNull
private String price;
@NotNull
private String brand;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public User getOwner() {
return owner;
}
public void setOwner(User owner) {
this.owner = owner;
}
}
Le entità Product e FollowingRelationShip non hanno alcuna relazione esplicita, quindi il join sulla mia implementazione about.What voglio ottenere è ottenere tutti i prodotti da tutti gli utenti che un altro utente segue in Spring data Specifications.
dovrebbe 'pfJoin.on (cb.equal (pfJoin.get (" following ")," owner "));' be 'pfJoin.on (cb.equal (pfJoin.get (" following ")," owner_id "));'? – Galz
@Galz yes, owner_id è il nome della colonna unita che ha riferimento al campo uuid proprietario (che è anche l'ID dell'entità). Btw ho provato già con owner_id e proprietario ma nessuno funziona – murielK