Reputation: 3
I'm trying to add some features to project which I find. There was query which selects specified results. Now I'm trying to get second query's results. Here's my code:
Car.java
@Entity
@NamedQueries({
@NamedQuery(name = "car.unsold", query = "Select c from Car c where c.sold = false"),
@NamedQuery(name="car.findByName", query=" SELECT C FROM Car c where c.make=?")
})
public class Car {
private Long id;
private String make;
private String model;
//and all getters and setters
}
CarManager.java
@Stateless
public class CarManager {
@PersistenceContext
EntityManager em1;
@SuppressWarnings("unchecked")
public List<Car> getAvailableCars() {
return em1.createNamedQuery("car.unsold").getResultList();
}
@SuppressWarnings("unchecked")
public List<Car> getCarsByName(String make){
return em1.createNamedQuery("car.findByName").setParameter(1, make).getResultList();
}}
CarBean.java
@SessionScoped
@Named("carBean")
public class CarFormBean implements Serializable {
private static final long serialVersionUID = 1L;
private Car car = new Car();
private ListDataModel<Car> cars = new ListDataModel<Car>();
private ListDataModel <Car> searchresult = new ListDataModel<Car>();
private String searchCar;
public String getSearchCar() {
return searchCar;
}
public void setSearchCar(String searchCar) {
this.searchCar = searchCar;
}
@Inject
private CarManager cm;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public ListDataModel<Car> getAvailableCars() {
cars.setWrappedData(cm.getAvailableCars());
return cars;
}
public ListDataModel<Car> getCarsByName(){
searchresult.setWrappedData(cm.getCarsByName(searchCar));
return searchresult;
}
public String searchCar(){
cm.getCarsByName(searchCar);
return null;
}
My question is how to display the results of carByName query? Is the code above OK? Results of first query are printed by:
<rich:dataTable value="#{carBean.availableCars}" var="car"
But how is it done? I can't see method called availableCars.
UPDATE Search.xhtml http://wklej.org/id/921560/ all.xhtml http://wklej.org/id/921561/
Upvotes: 0
Views: 973
Reputation: 23916
In this case, the expression #{carBean.availableCars}
does not refer to a method, but to a property of the bean carBean
. So it evaluates to the method getAvailableCars()
of the carBean
. Take a loot at the Expression Language tag info page to learn more about this.
Note that it's not a good practice to call service methods on a getter (see this question). You'd be better with an initialization method annotated with @PostConstruct
.
Also, you don't need a separate lists for the results. Just make an action method that fills the list of cars with the search results - say searchCars()
, and make your search button to call it:
<h:commandButton value="Search" action="#{carBean.searchCars}" />
So, putting this together, this is what your bean code should look like:
@SessionScoped
@Named("carBean")
public class CarFormBean implements Serializable {
private static final long serialVersionUID = 1L;
private Car car = new Car();
// a list for storing the available cars and the search results
private ListDataModel<Car> cars = new ListDataModel<Car>();
private String searchCar;
@Inject
private CarManager cm;
// initialization method
@PostConstruct
public void init() {
cars.setWrappedData(cm.getAvailableCars());
}
// action method
public void searchCars() {
cars.setWrappedData(cm.getCarsByName(searchCar));
}
// getters and setters
public ListDataModel<Car> getAvailableCars() {
return cars;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public String getSearchCar() {
return searchCar;
}
public void setSearchCar(String searchCar) {
this.searchCar = searchCar;
}
Upvotes: 2