0

私が見つけたプロジェクトにいくつかの機能を追加しようとしています。指定した結果を選択するクエリがありました。今、2 番目のクエリの結果を取得しようとしています。これが私のコードです:

車.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;
    }   

私の質問は、carByName クエリの結果を表示する方法ですか? 上記のコードは大丈夫ですか?最初のクエリの結果は次のように出力されます。

<rich:dataTable value="#{carBean.availableCars}" var="car" 

しかし、それはどのように行われますか?availableCars というメソッドが表示されません。

UPDATE Search.xhtml http://wklej.org/id/921560/ all.xhtml http://wklej.org/id/921561/

4

1 に答える 1

2

この場合、式#{carBean.availableCars}はメソッドではなく、Bean のプロパティを参照しますcarBeangetAvailableCars()したがって、 のメソッドに評価されcarBeanます。詳細については、Expression Language タグ情報ページを参照してください。

getter でサービス メソッドを呼び出すことはお勧めできません (この質問を参照してください)。で注釈を付けた初期化メソッドを使用したほうがよいでしょう@PostConstruct

また、結果用に個別のリストは必要ありません。車のリストに検索結果を入力するアクション メソッドを作成するだけsearchCars()です。

<h:commandButton value="Search" action="#{carBean.searchCars}" />

これをまとめると、Bean コードは次のようになります。

@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;
    }
于 2013-01-11T12:58:32.410 に答える