Hi, I'm working for the first time with Hibernate and I'm having some query problems.
When I execute a simple retrieve with my DAO :
Code:
@Override
public SortedSet<Jurisdiction> getAllSortedWithLocalized() {
SortedSet<Jurisdiction> results = new TreeSet<Jurisdiction>();
Query query = this.session.createQuery(
"from " + Jurisdiction.class.getName() + " jurisdiction " +
"left join fetch jurisdiction.localizedFields ");
results.addAll(query.list());
return results;
}
Hibernate executes the following queries :
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, localizedf1_.locale as locale1_1_, localizedf1_.jur_id as jur5_1_1_, jurisdicti0_.rank as rank0_0_, localizedf1_.title as title1_1_, localizedf1_.url_image as url3_1_1_, localizedf1_.url_image_target as url4_1_1_, localizedf1_.jur_id as jur5_0_0__, localizedf1_.locale as locale0__, localizedf1_.jur_id as jur5_0__ from jurisdiction jurisdicti0_ left outer join jurisdiction_localized localizedf1_ on jurisdicti0_.jur_id=localizedf1_.jur_id
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?
Hibernate: select jurisdicti0_.jur_id as jur1_0_0_, jurisdicti0_.rank as rank0_0_ from jurisdiction jurisdicti0_ where jurisdicti0_.jur_id=?Now, the first executed query retrieves everything I need... all of the jurisdiction and their localized fields. The problem is after the first query, Hibernate executes a SELECT for EVERY jurisdiction in the database. I can't figure out why, since those fields are already retrieved with the first query.
Here is my entity class (minus all getters/setters) :
Code:
@Entity
@Table(name = "jurisdiction")
public class Jurisdiction implements Comparable<Jurisdiction>{
@Column(name = "jur_id")
@Id
private String jurId;
private Integer rank;
@Sort(type=SortType.NATURAL)
@OneToMany(mappedBy="jurisdiction", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private SortedSet<FrequentlyConsultedDocument> frequentlyConsultedDocuments = new TreeSet<FrequentlyConsultedDocument>();
@Sort(type=SortType.NATURAL)
@OneToMany(mappedBy="jurisdiction", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private SortedSet<ExternalLink> externalLinks = new TreeSet<ExternalLink>();
@Sort(type=SortType.NATURAL)
@OneToMany(mappedBy="jurisdiction", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@Where(clause="collection_type='COURT'")
private SortedSet<Collection> courts = new TreeSet<Collection>();
@Sort(type=SortType.NATURAL)
@OneToMany(mappedBy="jurisdiction", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@Where(clause="collection_type='TRIBUNAL'")
private SortedSet<Collection> tribunals = new TreeSet<Collection>();
@OneToMany(targetEntity=JurisdictionLocalizedFields.class, mappedBy="jurisdiction", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@MapKeyColumn(name="locale")
private Map<Locale, JurisdictionLocalizedFields> localizedFields = new HashMap<Locale, JurisdictionLocalizedFields>(2);
public Jurisdiction(){}
public Jurisdiction(String jurId, int rank) {
this.jurId = jurId;
this.rank = rank;
}
@Entity
@Table(name = "jurisdiction_localized")
public static class JurisdictionLocalizedFields implements Serializable {
private static final long serialVersionUID = 1L;
@Id
Locale locale;
String title;
@Column(name = "url_image")
String urlImage;
@Column(name = "url_image_target")
String urlImageTarget;
@ManyToOne
@JoinColumn(name="jur_id")
@Id Jurisdiction jurisdiction;
public JurisdictionLocalizedFields(){}
public JurisdictionLocalizedFields(Locale locale, Jurisdiction jurisdiction, String title, String urlImage, String urlImageTarget){
this.jurisdiction = jurisdiction;
this.locale = locale;
this.urlImage = urlImage;
this.urlImageTarget = urlImageTarget;
}
}
I am using the Hibernate version 3.6.1.Final with the Postgresql dialect.
Any help is appreciated.
Thanks