我使用primefaces组件和Hibernate的数据持久性在Eclipse中创建了一个JSF项目。在这个项目中,对于每个模型类,至少有两个视图(xhtml页面),一个DAO类和一个控制器类。在DAO中,有以下方法返回我用来填充DataTable的对象列表。下面我把DAO和xhtml页面的片段用于填充DataTable。
TextoBaseDAO.java
public List<Textobase> listar()
{
List<Textobase> listTextobase = null;
String query = "SELECT * FROM tbl_textobase inner join tbl_disciplina on tbl_textobase.disciplina_textobase = tbl_disciplina.id_disciplina";
try
{
this.manager.getTransaction().begin();
listTextobase = this.manager.createNativeQuery(query, new Textobase().getClass()).getResultList();
this.manager.getTransaction().commit();
}
catch(Exception ex)
{
listTextobase = null;
this.manager.getTransaction().rollback();
}
return listTextobase;
}
TextobaseController.java
private List<Assunto> assuntos;
public List<Textobase> getTextosBases()
{
this.textosBases = textoBaseDao.listar();
return textosBases;
}
Textobaselist.xhtml
<p:dataTable var="textobase" value="#{textobaseController.textosBases}" id="textobaseTable" rowKey="#{textobase.codigo_textobase}"
selectionMode="single" selection="#{textobaseController.currentTextoBase}" style="text-align:center" paginator="true" rows="10"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="5,10,15" lazy="true">
<f:facet name="header">
Texto Base
<br/>
</f:facet>
<p:column width="50" headerText="Código" sortBy="codigo_textobase" id="codigo_textobase" filterBy="codigo_textobase" filterMatchMode="contains">
#{textobase.codigo_textobase}
</p:column>
<p:column width="650" headerText="Texto" sortBy="texto_textobase" id="texto_textobase" filterBy="texto_textobase" filterMatchMode="contains">
#{textobase.titulo_textobase}
</p:column>
到目前为止,这一切都很完美。但我需要运行一个查询,该查询使用内部联接返回带有外部表字段的对象,以填充DataTable,包括外部表的字段。所以查询看起来像这样:
String query = "SELECT ";
query += "tbl_textobase.codigo_textobase, ";
query += "tbl_textobase.titulo_textobase, ";
query += "tbl_disciplina.nome_disciplina ";
query += "FROM tbl_textobase ";
query += "inner join tbl_disciplina ";
query += "on tbl_textobase.disciplina_textobase = tbl_disciplina.id_disciplina";
但是当我返回Textobase列表时,外表的字段不会在此列表中返回。所以这是我的问题:
我应该在&#34; listar()&#34;中做出哪些改变?方法和我的DataTable返回一个列表,包括外表的字段,可以正确填充dataTable?
荷。
答案 0 :(得分:0)
一些事情......
listTextobase = this.manager.createNativeQuery(query,
new Textobase().getClass()).getResultList();
将映射到Textobase类......所以最直接的解决方案是在类中添加一些瞬态属性,用@Transient注释:ie:
private String attribute;
...
@Transient
public String getAttribute(){
return this.attribute;
}
...
接下来,您可能想要
List<Object[]> list = (List<Object[]>)entityManager
.createNativeQuery(query).getResultList();
因此,您可以迭代Object []列表。接下来,您的Textobase类应该有一个n参数构造函数,其中所有参数都是Object.class的实例,包括瞬态属性。然后你可以有类似的东西:
List<TextoBase> result = new ArrayList<TextoBase>();
for (Object[] o : list){
TextoBase row = new TextoBase(o[0],o[1],o[2],...);
result.add(aux);
}
希望这会有所帮助。 Suerte。