2016-03-31 14 views
0

Bu SQL deyimi vardır:Hazırda bekleyen ölçütlere sahip birleşik tablolardan belirli varlık nasıl seçilir?

select c.* 
from tableA a 
inner join tableB b on a.id = b.a_id        
inner join tableC c on b.id = c.b_id 

ve benim ölçüt:

Criteria criteria = session.createCriteria(tableA.class, "a") 
       .createAlias("a.b", "b") 
       .createAlias("b.c", "c"); 

nasıl kriterlere TableC seçebilir?

gibi bir şey -

List<tableC> listC = criteria.list() 

Ben projeksiyon .setProjection(Property.forName("c"))

eklemek çalıştı ama ben takip hata var:

CnTermsGroup sınıf

:

org.hibernate.QueryException: could not resolve property: c of: ...xx.xx.tableA 
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81) 
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75) 
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1465) 

bu benim sınıfları olduğunu 0

@Entity 
@Table(name="CN_TERMS_GROUP") 
public class CnTermsGroup extends implements Serializable { 

private static final long serialVersionUID = 1145853863134597537L; 

@Id 
@Column(name="CN_TERMS_GROUP_ID") 
private long cnTermsGroupId; 

@Column(name="CN_TERMS_GROUP_NAME") 
private String cnTermsGroupName; 

@OneToMany(mappedBy="cnTermsGroup", cascade=CascadeType.ALL, orphanRemoval=true) 
@Fetch(FetchMode.SUBSELECT) 
private List<CnTermsCounted> cnTermsCounteds; 

public CnTermsGroup() { 
} 

public long getCnTermsGroupId() { 
    return this.cnTermsGroupId; 
} 

public void setCnTermsGroupId(long cnTermsGroupId) { 
    this.cnTermsGroupId = cnTermsGroupId; 
} 

public String getCnTermsGroupName() { 
    return this.cnTermsGroupName; 
} 

public void setCnTermsGroupName(String cnTermsGroupName) { 
    this.cnTermsGroupName = cnTermsGroupName == null ? "" : cnTermsGroupName; 
} 

public List<CnTermsCounted> getCnTermsCounteds() { 
    return this.cnTermsCounteds; 
} 

public void setCnTermsCounteds(List<CnTermsCounted> cnTermsCounteds) { 
    this.cnTermsCounteds = cnTermsCounteds; 
} 

@Override 
public Object getId(){ 
    return cnTermsGroupId; 
} 

}

CnTermsCounted sınıfı

@Entity 
@Table(name="CN_TERMS_COUNTED") 
public class CnTermsCounted extends BaseModelImp implements Serializable{ 

private static final long serialVersionUID = -8486592249097766983L; 

@Id 
@Column(name="CN_TERMS_COUNTED_ID") 
private long cnTermsCountedId; 

@ManyToOne(fetch = FetchType.LAZY) 
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
@JoinColumn(name="CN_TERMS_GROUP_ID") 
private CnTermsGroup cnTermsGroup; 

@OneToMany(mappedBy = "cnTermsCounted", cascade=CascadeType.ALL, orphanRemoval=true) 
@Fetch(FetchMode.SUBSELECT) 
private Set<CnTermsRun> cnTermsRuns; 

public CnTermsCounted() { 
} 

public long getCnTermsCountedId() { 
    return this.cnTermsCountedId; 
} 

public void setCnTermsCountedId(long cnTermsCountedId) { 
    this.cnTermsCountedId = cnTermsCountedId; 
} 

public CnTermsGroup getCnTermsGroup() { 
    return this.cnTermsGroup; 
} 

public void setCnTermsGroup(CnTermsGroup cnTermsGroup) { 
    this.cnTermsGroup = cnTermsGroup; 
} 


public Set<CnTermsRun> getCnTermsRuns() { 
    return this.cnTermsRuns; 
} 

public void setCnTermsRuns(Set<CnTermsRun> cnTermsRuns) { 
    this.cnTermsRuns = cnTermsRuns; 
} 

@Override 
public Object getId() { 
    return cnTermsCountedId; 
} 

}

ve CnTermsRun sınıfı

@Entity 
@Table(name="CN_TERMS_RUN") 
public class CnTermsRun extends BaseModelImp { 
private static final long serialVersionUID = -9042920700902106238L; 

@Id 
@Column(name="CN_TERMS_RUN_ID") 
private long cnTermsRunId; 

@ManyToOne 
@JoinColumn(name="CN_TERMS_COUNTED_ID") 
private CnTermsCounted cnTermsCounted; 


public CnTermsRun() { 
} 

public long getCnTermsRunId() { 
    return this.cnTermsRunId; 
} 

public void setCnTermsRunId(long cnTermsRunId) { 
    this.cnTermsRunId = cnTermsRunId; 
} 


public CnTermsCounted getCnTermsCounted() { 
    return this.cnTermsCounted; 
} 

public void setCnTermsCounted(CnTermsCounted cnTermsCounted) { 
    this.cnTermsCounted = cnTermsCounted; 
} 

/* (non-Javadoc) 
* @see com.sintecmedia.onair.model.imp.BaseModelImp#getId() 
*/ 
@Override 
public Object getId() { 
    return cnTermsRunId; 
} 
} 

ve kriterleri:

Criteria criteria = session.createCriteria(CnTermsGroup.class, "cnTermsGroup") 
     .createAlias("cnTermsGroup.cnTermsCounteds", "cnTermsCounted") 
     .createCriteria("cnTermsCounted.cnTermsRuns") 
     .setResultTransformer(Transformers.aliasToBean(CnTermsRun.class)); 
+0

= session.createCriteria (tableC.class, "c",)? – StanislavL

+0

Bu Hazırda bekletme, JPA sınıflarımdaki DB'lere yapılan isabetleri azaltmak için sahip olduğum '@Fetch (FetchMode.SUBSELECT)' açıklamasını kullanır. – Mie

+0

Peki ya .setResultTransformer (Transformers.aliasToBean (tableC.class))? – StanislavL

cevap

0

İki yaklaşım düşünebilirim.

İlk yaklaşım Bu List<Map<String, Object>> döndürür

Criteria criteria = session.createCriteria(CnTermsGroup.class, "cnTermsGroup") 
     .createAlias("cnTermsGroup.cnTermsCounteds", "cnTermsCounted") 
     .createAlias("cnTermsCounted.cnTermsRuns", "cnTermsRuns") 
     .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP); 

aşağıdaki gibi Criteria.ALIAS_TO_ENTITY_MAP kullanıyor. Toplama CnTermsRun varlıklara: Biz Formül için aşağıda, alias name kullanarak gerekli varlıkları toplayabilir

List<CnTermsRun> subEntities = new ArrayList<>(); 
List<Map<String, Object>> objects = criteria.list(); 
for (Map<String, Object> record : objects) { 
    subEntities.add((CnTermsRun)record.get("cnTermsRuns")); 
} 

İkinci yaklaşım Bu doğrudan List<CnTermsRun> döndürür ama gerektirir

aşağıdaki gibi Transformers.aliasToBean(...) kullanıyor varsayılan yapıcı ile birlikte eklenecek yeni bir constructor:

public CnTermsRun(long cnTermsRunId, CnTermsCounted cnTermsCounted) { 
    this.cnTermsRunId = cnTermsRunId; 
    this.cnTermsCounted = cnTermsCounted; 
} 

Ve aşağıda kriterleri:

Eğer TableC sınıfları neden Kriterleri ölçütlerinden başlayamaz gerekiyorsa
Criteria criteria = session.createCriteria(CnTermsGroup.class, "cnTermsGroup") 
     .createAlias("cnTermsGroup.cnTermsCounteds", "cnTermsCounted") 
     .createAlias("cnTermsCounted.cnTermsRuns", "cnTermsRuns") 
     .setProjection(Projections.projectionList().add(Projections.alias(Projections.property("cnTermsRuns.id"), "cnTermsRunId")).add(Projections.alias(Projections.property("cnTermsRuns.cnTermsCounted"), "cnTermsCounted"))) 
     .setResultTransformer(Transformers.aliasToBean(CnTermsRun.class)); 
List<CnTermsRun> subEntities = criteria.list(); 
İlgili konular