我在Eclipse中使用primeface组件和Hibernate的数据持久性创建了一个JSF项目。在这个项目中,对于每个模型类,至少有两个视图(xhtml页面),一个DAO类和一个控制器类。DAO有以下方法来返回我用来填充DataTable的对象列表。下面我放了我用来填充DataTable的DAO和xhtml页面的片段。
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;
}
文本数据库
<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";
但是当我返回一个文本库列表时,这个列表中不会返回外部表的字段。所以这是我的问题:
我应该在“listar()”方法和我的DataTable中进行哪些更改以返回包括外部表的字段并且可以正确填充dataTable的列表?
感激。
有几件事…
listTextobase = this.manager.createNativeQuery(query,
new Textobase().getClass()).getResultList();
将映射到Textobase类…所以最直接的解决方案是向类添加一些瞬态属性,并用@瞬态注释:即:
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);
}
希望这有帮助。苏尔特。