Hallo,
ich arbeite mich derzeit in die Criteria API von Hibernate ein (in Verbindung mit Spring) und stehe nun vor einem Problem.
Ich möchte eine Abfrage über 3 Tabellen machen, und benutze dafür die (gemappte) Relation.
Gestalte ich die Abfrage mit HQL gibt es keine Probleme. Nun möchte ich aber mit Criteria arbeiten und bekomme einen Fehler.
Ich weiß, dass bei Criteria's keine impliziten Joins möglich sind, man dies aber über Subquery's realisierenkann. Das klappt aber mit 3 Tabellen nicht. Hab ich der/die/das Criteria falsch aufgebaut?
Fehler:
Ist ja richtig, in der Klasse User gibt es keine mid. Scheinbar verschachtelt er die einzelnen Criteria's. Etwa so:
ich möchte aber
Ich hoffe es ist verständlich genug!
ich arbeite mich derzeit in die Criteria API von Hibernate ein (in Verbindung mit Spring) und stehe nun vor einem Problem.
Ich möchte eine Abfrage über 3 Tabellen machen, und benutze dafür die (gemappte) Relation.
Gestalte ich die Abfrage mit HQL gibt es keine Probleme. Nun möchte ich aber mit Criteria arbeiten und bekomme einen Fehler.
Ich weiß, dass bei Criteria's keine impliziten Joins möglich sind, man dies aber über Subquery's realisierenkann. Das klappt aber mit 3 Tabellen nicht. Hab ich der/die/das Criteria falsch aufgebaut?
Java:
public class MeldungenDAO extends HibernateDaoSupport{
public List getWarnungen(String name, Integer typ){
getHibernateTemplate().setMaxResults(0);
return getHibernateTemplate().findByNamedParam(
"select uid.uname, count(mid) "
+ "FROM Meldungen "
+ "WHERE uid.uname= :name "
+ "AND mid.typ= :typ group by uid",
new String[]{"name", "typ"}, new Object[]{name, typ});
}
public List getWarnungenCriteria(String name, Integer typ){
DetachedCriteria crit = DetachedCriteria.forClass(Meldungen.class)
.createCriteria("uid")
.add(Restrictions.eq("uid.uname", name))
.createCriteria("mid")
.add(Restrictions.eq("mid.typ", typ))
.setProjection(Projections.groupProperty("uid"))
.setProjection(Projections.count("mid"));
List<Meldungen> meld= getHibernateTemplate().findByCriteria(crit);
return meld;
}
}
Java:
@Entity
@Table(name="meldungen")
public class Meldungen implements Serializable {
private Integer id;
private Date timestamp;
private User uid;
private MeldungInfo mid;
public Meldungen(){
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Basic(optional=false)
@OneToOne(targetEntity=db.MeldungInfo.class)
@JoinColumn(name="mid")
public MeldungInfo getMid() {
return mid;
}
public void setMid(MeldungInfo mid) {
this.mid = mid;
}
@Basic(optional=false)
@Temporal(value=TemporalType.TIMESTAMP)
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
@Basic(optional=false)
@OneToOne(targetEntity=db.User.class)
@JoinColumn(name="uid")
public User getUid() {
return uid;
}
public void setUid(User uid) {
this.uid = uid;
}
}
Code:
org.hibernate.QueryException: could not resolve property: mid of: db.User
Code:
DetachedCriteria(Criteria "uid" (Criteria "mid" ))
Code:
DetachedCriteria((Criteria "uid" ) (Criteria "mid" ))
Ich hoffe es ist verständlich genug!