public List<Chambre> recherche(
                Date dateDebut, // obligatoire
                Date dateFin, // obligatoire
                Integer ignoredReservationId,//peut être null. Utilisé lors de modification de reservation
                Integer prixMin, //peut être null
                Integer prixMax, //peut être null
                Integer capaciteMin, //peut être null
                Integer capaciteMax, //peut être null
                String ville, //peut être null
                Integer hotelierId//peut être null. 
        ) {
            List<Chambre> liste = new LinkedList<Chambre>();
            try 
            {
                Statement stm = cnx.createStatement(); 
                String req = "select * from chambre "
                                
                                //La chambre doit être disponible pendant toute la période demandée
                                +" where datedebut <= \""+dateDebut +"\""
                                + " AND datefin >= \""+dateFin+"\""
                                
                                //On enleve toutes les chambres ou une reservation entre
                                // en conflit avec la periode demandée
                                + " AND chambreid NOT IN ( "
                                    + " SELECT chambreid FROM reservation "
                                    //Il y a un conflit si la reservation commence au milieu de la periode
                                    + " WHERE  ("
                                            + " datedebut> \""+dateDebut+"\""
                                            + " AND datedebut< \""+dateFin+"\""
                                        //ou si elle finit au millieu
                                        + " OR  "
                                            + " datefin> \""+dateDebut+"\""
                                            + " AND datefin< \""+dateFin+"\""
                                        //ou si la periode est entierement incluse dans le temps de la reservation
                                        + " OR  "
                                            + " datedebut <= \""+dateDebut+"\""
                                            + " AND dateFin >= \""+dateFin+"\""
                                    + "  )"
                                    //on ignore une reservation si specifié
                                    +(((ignoredReservationId==null))?"":
                                            " and reservationid <> "+ignoredReservationId+" ")
                                + " )"
                                +(((prixMin==null))?"":
                                            " and prix >= "+prixMin+" ")
                                +(((prixMax==null))?"":
                                            " and prix <= "+prixMax+" ")
                                +(((capaciteMin==null))?"":
                                            " and capacite >= "+capaciteMin+" ")
                                +(((capaciteMax==null))?"":
                                            " and capacite <= "+capaciteMax+" ")
                                +(((ville==null))?"":
                                            " and upper(ville) = \""+ville.toUpperCase()+"\" ")
                                +(((hotelierId==null))?"":
                                            " and hotelierid = "+hotelierId+" ");
                ResultSet r = stm.executeQuery(req);
                while (r.next())
                {
                        liste.add(
                                new Chambre(
                                        r.getInt("chambreid"),
                                        r.getDate("datedebut"),
                                        r.getDate("datefin"),
                                        r.getString("titre"),
                                        r.getString("description"),
                                        r.getInt("prix"),
                                        r.getInt("capacite"),
                                        r.getString("numerodechambre"),
                                        r.getString("image"),
                                        r.getString("ville"),
                                        r.getString("adresse"),
                                        r.getInt("hotelierid")
                                )
                        );
                }
                r.close();
                stm.close();
            }
            catch (SQLException exp)
            {
                
            }
            return liste;
	}