我需要创建一个动态查询,该查询在两个表之间具有一个关系(OneToMany
)。
这是我的资料库:
公共接口CommandeRtRepository扩展了JpaRepository,JpaSpecificationExecutor { }
这是我对findAll()函数的实现:
public List<Commande> getDetailCommandeByCodeCommande(Long codeCommande,String codeFournisseur, String codePN) {
return commandRep.findAll(new Specification<Commande>() {
@Override
public Predicate toPredicate(Root<Commande> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
root.join("supplier",JoinType.INNER);
root.join("TTDPUR041204",JoinType.INNER);
predicates.add(criteriaBuilder.equal(root.get("orno"), codeCommande));
Join<Commande, Supplier> comm_supp =null;
Join<Commande,TTDPUR041204> comm_tt =null;
if(codeFournisseur!=null && !codeFournisseur.equals("")) {
comm_supp = root.join("supplier",JoinType.INNER);
predicates.add(criteriaBuilder.like(comm_supp.get("suno"),codeFournisseur+""));
}
if(codePN!=null && !codePN.equals("")) {
comm_tt= root.join("TTDPUR041204",JoinType.INNER);
predicates.add(criteriaBuilder.like(comm_tt.get("item"),codePN));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
});
}
这是我的实体:
@Entity
@Table(name="TTCCOM020204")
public class Supplier {
@Id
@Column(name="t$suno")
private String suno;
@Column(name="t$name")
private String name;
@Column(name="t$nama")
private String nama;
@Column(name="t$namc")
private String namc;
@Column(name="t$namf")
private String namf;
//setter & getters
}
@Entity
@Table(name="TTDPUR040204")
public class Commande {
@Id
@Column(name="t$orno",unique=false)
private Long orno;
@Column(name="t$refa")
private String refa;
@Column(name="t$suno")
private String suno;
@OneToOne
@JoinColumn(name="t$suno",insertable=false, updatable=false)
private Supplier supplier;
@OneToOne
@JoinColumn(name="t$orno",insertable=false, updatable=false)
private TTDPUR041204 TTDPUR041204;
//setter && getter }
@Entity
@Table(name="TTDPUR041204")
public class TTDPUR041204 {
@Id
@Column(name="t$orno",unique=false)
private Long orno;
@Column(name="t$item")
private String item;
// Setter && getter}
在我的数据库中,我有两个行的列名(orno)的值与Commande类中的@ID相同。 这就是我数据库中的内容:
----------------------------------------
| t$orno| t$refa | t$sono |
|-------|----------------|-------------|
| 1 | referent 1 | 3 |
|-------|----------------|-------------|
| 1 | referent 2 | 4 |
我的问题是:我的实现是否正确?如果是这样,为什么我要两次获得第一行而不是拖车行?