Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 方法返回一个列表,以从包含内部联接的查询填充DataTable_Hibernate_Jpa_Jsf 2_Primefaces_Datatable - Fatal编程技术网

Hibernate 方法返回一个列表,以从包含内部联接的查询填充DataTable

Hibernate 方法返回一个列表,以从包含内部联接的查询填充DataTable,hibernate,jpa,jsf-2,primefaces,datatable,Hibernate,Jpa,Jsf 2,Primefaces,Datatable,我在Eclipse中使用primefaces组件和Hibernate的数据持久性创建了一个JSF项目。在这个项目中,对于每个模型类,至少有两个视图(xhtml页面),一个DAO类和一个控制器类。在DAO中,有以下方法返回用于填充数据表的对象列表。下面是我用来填充数据表的DAO和xhtml页面的片段 textobaseado.java public List<Textobase> listar() { List<Textobase> listTexto

我在Eclipse中使用primefaces组件和Hibernate的数据持久性创建了一个JSF项目。在这个项目中,对于每个模型类,至少有两个视图(xhtml页面),一个DAO类和一个控制器类。在DAO中,有以下方法返回用于填充数据表的对象列表。下面是我用来填充数据表的DAO和xhtml页面的片段

textobaseado.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;
}
但是,当我返回一个Textobase列表时,外部表的字段不会在这个列表中返回。所以我的问题是:

我应该在“listar()”方法和我的DataTable中进行哪些更改,以返回一个包含外部表字段的列表,并且可以正确填充DataTable

非常感谢。

有几件事

    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();
List List=(List)entityManager
.createNativeQuery(query.getResultList();
因此,您可以迭代对象[]列表。接下来,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);
}
List result=new ArrayList();
对于(对象[]o:list){
TextoBase行=新的TextoBase(o[0],o[1],o[2],…);
结果.添加(aux);
}
希望这有帮助。苏尔特

    private String attribute;        
    ...
    @Transient
    public String getAttribute(){
         return this.attribute;
    }
    ...
List<Object[]> list = (List<Object[]>)entityManager
             .createNativeQuery(query).getResultList();
    List<TextoBase> result = new ArrayList<TextoBase>();
    for (Object[] o : list){
       TextoBase row = new TextoBase(o[0],o[1],o[2],...);
   result.add(aux);
}