2013-11-06 5 views
0

У меня есть таблица базы данных, отображаемая через Datatable (Primefaces 3.4.2), и я хочу показать comboFilter в заголовке, заполненном значениями из самой таблицы базы данных.Primefaces Datatable filterOption в столбцах

1) Поскольку эти значения не являются PK или FK, я построил имени запрос для получения различных значений для столбца prefDep:

@NamedQuery(name = "Upb.findPrefDeps", query = "SELECT DISTINCT u FROM Upb u WHERE u.prefDep = :prefDep") 

2) В моей AbstractController:

public List<T> getPrefDepsList() { 
    if (prefDeps == null) { 
    prefDeps = this.ejbFacade.findPrefDeps(); 
    } 
     return prefDeps; 
} 

3) Когда я добавляю EJB фасада, как я могу построить свойство управляемого bean, которое будет использоваться в filterOption ниже? managedBean:

@ManagedBean(name = "upbController") 
@ViewScoped 
public class UpbController extends AbstractController<Upb> implements Serializable { 

@EJB 
private UpbFacade ejbFacade; 

public UpbController() { 
    super(Upb.class); 
} 

@PostConstruct 
public void init() { 
    super.setFacade(ejbFacade); 
} 

public SelectItem[] getPrefDepOptions() { 
    return prefDepOptions; //build/populate this 
} 
} 

для JSF:

<p:column filterBy="prefdep" headerText="PrefDep" 
    filterOptions="#{upbController.prefDepOptions}" 
    filterMatchMode="exact"> 
     <h:outputText value="#{item.prefDep}" /> 
</p:column> 

Спасибо заранее.

ответ

0

Я не знаю, правильно ли я понимаю ваш вопрос. Вы хотите выполнить именованный запрос один раз и сохранить отдельные значения в свойстве в управляемом компоненте? Для этого вы можете использовать событие PreRenderView, которое вызывается перед отображением страницы. Вы можете вызвать функцию init для загрузки таких значений с этим событием.

Вы также можете получить доступ к получателю с именованным запросом, но это может быть вызвано не только один раз.

+0

Для лучшего понимания см. Http://www.primefaces.org/showcase/ui/datatableFiltering.jsf. Как видно из примера tableBeans.java, значения, загруженные в комбо, жестко закодированы. Представьте таблицу, в которой значения комбо-значений меняются со временем. Это очень трудный выход. Хорошо. Если я сейчас понял, есть ли у вас какие-либо идеи о том, как сделать это с использованием не жесткого кодирования? И, пожалуйста, приведи пример (на основе моей проблемы здесь, если это возможно) о вашей идее (_access getter с именованным запросом_)? Кстати, я думаю, что это очень хорошая идея. Благодарю. – jMarcel

+0

Я бы сделал это так: сделайте событие на preRenderView или postAddToView (последний не вызывается при обратной передаче) и заполните ваши значения из именованного запроса в частный член, чтобы не загружать их слишком часто из базы данных. Тогда вам просто нужно сделать способ, подобный 'public List getPrefDepOptions()' в вашем компоненте (вы также можете использовать собственные объекты в этом списке!), Чтобы дать им атрибут filterOptions, как показано в примере. Если у вас есть статические объекты или динамический список, то это не имеет значения. Элементы SelectItems должны содержать метку и значение - или вы используете свои собственные объекты. – anm

+0

anm, есть ли у вас практический пример (ссылка, книга, что угодно) об этом? Благодарю. – jMarcel

Смежные вопросы