JPA Ölçüt Oluşturucu kullanılarak ek sayım sütunu ile sorgu nasıl yazılır
Aug 18 2020
Veritabanında bulunan tüm P nesnelerini döndürecek bir JPA sorgusu yazmakta zorlanıyorum ve bunların yanında, özelliğiA = 1 olan S çocuklarının sayısını istiyorum.
SQL sorgusu
P. *, P_table p'den (s_table s WHERE p.id = s.p_id ve s.propertyA = 1'den count (s.id) seçin)
Eşleme:
@Entity
@Table(name = "t_table")
public class PTable{
@Id
private String id;
@Version
private Long version;
private String subject;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "p_id", referencedColumnName = "id")
private Set<STable> sSet = new HashSet<>();
}
@Entity
@Table(name = "s_table")
public class STable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "p_id")
private String pId;
private String propertyA;
}
Ayrıca, JPA'da karmaşık sorgular yazmak için herhangi bir iyi öğreticiye işaret etmek ister misiniz?
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<PTable> q = cb.createQuery(PTable.class);
Root<PTable> c = q.from(PTable.class);
Yanıtlar
JLazar0 Aug 19 2020 at 09:57
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyPojo> cq = cb.createQuery(MyPojo.class);
Root<PTable> rootPTable = cq.from(PTable.class);
Join<PTable, STable> joinSTable = rootPTable.join(PTable_.sSet);
Subquery<Long> sqCount = cq.subquery(Long.class);
Root<STable> sqRootSTable = sqCount.from(STable.class);
Join<STable, PTable> sqJoinPTable = sqRootSTable.join(STable_.pSet);
sqCount.where(cb.and(
cb.equal(sqJoinPTable.get(PTable_.id),rootPTable.get(PTable_.id)),
cb.equal(sqRootSTable.get(STable_.propertyA),"1")));
sqCount.select(cb.count(sqRootSTable));
cq.multiselect(
rootPTable.get(PTable_.id),
rootPTable.get(PTable_.version),
rootPTable.get(PTable_.subject),
joinSTable.get(STable_.id),
sqCount.getSelection(),
);
Bir kurucunun sahip olduğu, çok seçim parametreleriyle aşağıdaki gibi sırayla ve türle eşleşen sonuçları elde etmek için bir Pojo'ya ihtiyacınız olacak:
public MyPojo(String pId, Long version, String subject, Long sId, Long count){
[...]
}
Ayrıca, varlıklarınızı ilişkiyi doğru bir şekilde eşlemek için değiştirmeniz, performansı artırmak için aşağıdaki gibi iki yönlü ve tembel olmanız gerekecektir:
PTable
@OneToMany(mappedBy="p",fetch = FetchType.LAZY)
private Set<STable> sSet;
Kararlı
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id")
private PTable p;
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'