提问者:小点点

方法返回List以从包含内连接的查询填充DataTable


我在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的列表?

感激。


共1个答案

匿名用户

有几件事…

    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);
}

希望这有帮助。苏尔特。