Ce que j'essaie de faire ci-dessous est une recherche multicritères sur une table associée à d'autres tables (OneToMany).

Voici un résumé de la situation:
Customer 1 - * Address.

Un customer possède donc plusieurs addresses.

La classe Customer simplifiée:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
@Entity
@Table(name = "CUSTOMER")
public class Customer implements java.io.Serializable {
 
	private List<Address> address;
 
	@OneToMany
	@JoinColumn(name = "customer_ref")
	public List<Address> getAddress() {
		return address;
	}
 
	public void setAddress(List<Address> address) {
		this.address = address;
	}
 
}
et la classe Address (aussi simplifiée)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
@Entity
@Table(name = "ADDRESS")
public class Address implements java.io.Serializable {
 
private AddressId id;
	private String zipcode;
	private String address1;
 
	@Column(name = "ZIPCODE", length = 16)
	public String getZipcode() {
		return this.zipcode;
	}
 
	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
 
	@Column(name = "ADDRESS_1", nullable = false, length = 80)
	public String getAddress1() {
		return this.address1;
	}
 
	public void setAddress1(String address1) {
		this.address1 = address1;
	}
}

Et finalemeent la fonction permettant la recherche (qui ne fonctionne pas):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
public List<Customer> searchCustomers(Map<String, String> criterias) {
		String companyName = criterias.get("name");
		String address = criterias.get("address");
		String zipCode = criterias.get("zipCode");
		Session session = HibernateUtil.getSessionFactory().openSession();
 
		Criteria criteria = session.createCriteria(Customer.class);
 
		if (companyName != null) {
			criteria.add(Restrictions.ilike("companyName", companyName + "%"));
		}
		if (address != null) {
			criteria.add(Restrictions.ilike("address1", address + "%"));
		}
		if (zipCode != null) {
			criteria.add(Restrictions.ilike("zipcode", zipCode + "%"));
		}
 
		return (List<Customer>) criteria.list();
}
Seule la recherche sur le champ companyName fonctionne car c'est un attribut de la classe Customer.

Lorsque j'essaie de traiter des champs de la classe Address, voici l'erreur publiée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
could not resolve property: Address of: com.xx.be.Program.model.database.Customer

Comment puis-je donc arriver à accéder à la première occurence de ma liste d'adresses ? J'imagine qu'il s'agit de quelque chose ressemblant à :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
	criteria.add(Restrictions.ilike("address[0].address1", address + "%"));