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:
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 @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; } }
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):
Seule la recherche sur le champ companyName fonctionne car c'est un attribut de la classe Customer.
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(); }
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 + "%"));
Partager