Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
Jsf 从CDIBean调用jpa实体管理器查询的正确方法_Jsf_Jpa_Primefaces - Fatal编程技术网

Jsf 从CDIBean调用jpa实体管理器查询的正确方法

Jsf 从CDIBean调用jpa实体管理器查询的正确方法,jsf,jpa,primefaces,Jsf,Jpa,Primefaces,Primefaces 5.3 glassfish 4.1 以下是我的实体管理 @Stateless public class ManagerTask { @PersistenceContext(unitName="task") private EntityManager em; ManagerTask(){} public List<Task> findAllTask() { TypedQuery<Task> q = em.createNamedQue

Primefaces 5.3 glassfish 4.1

以下是我的实体管理

@Stateless
public class ManagerTask {

@PersistenceContext(unitName="task")
private EntityManager em;

ManagerTask(){} 

public List<Task> findAllTask() {

    TypedQuery<Task> q =  em.createNamedQuery("Task.findAll",Task.class);
    List<Task> taskList = q.getResultList();

    return taskList;

}   
现在在我的cdibean中,我想调用findAllTask方法获取tak列表,然后在我的jsf中使用它创建一个datatable

方法1:

菜豆

@Named(value="bt") 
@ViewScoped 
public class BeanTask {
@SuppressWarnings("unused")
private static final long serialVersionUID = 1L; 


private ManagerTask mt;

private List<Task> tl;
private List<Task> filteredtl;
private ArrayList<SelectItem> regions;

public BeanTask() {
    // TODO Auto-generated constructor stub

}

@Inject
public BeanTask(ManagerTask mt) {
    this.mt=mt;
    tl=mt.findAllTask();
}
@Inject
private ManagerTask mt;

private List<Task> tl;
private List<Task> filteredtl;
private ArrayList<SelectItem> regions;

public BeanTask() {
    // TODO Auto-generated constructor stub

}


public List<Task> getalltasks() {
    tl=mt.findAllTask();  




    return tl; 
}
jsf

这是我以前使用的方法,但我意识到构造函数被多次调用,导致多次重复查询的执行,正如这里的一位成员在另一个问题中所建议的那样,任何业务逻辑都不应该进入我移动到方法2的CDIBean的构造函数中

方法2:

菜豆

@Named(value="bt") 
@ViewScoped 
public class BeanTask {
@SuppressWarnings("unused")
private static final long serialVersionUID = 1L; 


private ManagerTask mt;

private List<Task> tl;
private List<Task> filteredtl;
private ArrayList<SelectItem> regions;

public BeanTask() {
    // TODO Auto-generated constructor stub

}

@Inject
public BeanTask(ManagerTask mt) {
    this.mt=mt;
    tl=mt.findAllTask();
}
@Inject
private ManagerTask mt;

private List<Task> tl;
private List<Task> filteredtl;
private ArrayList<SelectItem> regions;

public BeanTask() {
    // TODO Auto-generated constructor stub

}


public List<Task> getalltasks() {
    tl=mt.findAllTask();  




    return tl; 
}
jsf

我认为第二种方法可能是正确的方法,但我遇到的问题是,如果我尝试对datatable的一列进行排序,那么第二种方法不起作用,我从其他问题中发现,这是因为该方法每次都查询数据库,而不是使用存储值。使用方法1排序工作


是否有一种完全不同的方法可以做到这一点,或者我遗漏了什么

我无法完全理解您发布的示例代码,但尽管如此,我还是为您提供了一个使用列过滤的示例

服务

看法

一个简单的表单示例

请注意,它会在保存事件后更新taskDataTable

<h:form id="taskForm" prependId="false">
    <p:inputText id="taskFormName" label="Name" value="#{taskBean.task.name}" />
    <!-- more fields here ... -->
    <p:commandButton id="taskFormSave" actionListener="#{taskBean.save}" value="Save" update="taskDataTable" />
</h:form>
具有列筛选的数据表


您使用的jsf的版本/类型是什么?如果您有import javax.faces.bean.viewscope,您能从BeanTask.java上的import语句告诉我们吗;或导入javax.faces.view.ViewScoped;请检查是否适用
@Named
@ViewScoped 
public class TaskBean {

    private static final long serialVersionUID = 1L; 

    @Inject
    private TaskManager taskManager;

    // Filtered entity list
    private List<Task> filteredTasks;

    // Main entity list
    private List<Task> tasks;

    // Main entity
    private Task task;

    @PostConstruct
    public void init() {
        reset();
    }

    private void reset() {
        tasks = taskManager.findAll();
    }

    public void create() {
         task = new Task();
    }

    public void save() {
        taskManager.save(task);
        reset(); 
    }

    public Task getTask() {
        return task;
    }

    public List<Task> getTasks() {
        return tasks;
    }

    public List<Task> getFilteredTasks() {
         return filteredTasks;
    }   

    public void setFilteredTasks(List<Task> filteredTasks) {
        this.filteredTasks = filteredTasks;
    }   
}
<h:form id="taskForm" prependId="false">
    <p:inputText id="taskFormName" label="Name" value="#{taskBean.task.name}" />
    <!-- more fields here ... -->
    <p:commandButton id="taskFormSave" actionListener="#{taskBean.save}" value="Save" update="taskDataTable" />
</h:form>
<p:dataTable id="taskDataTable" value="#{taskBean.tasks}" filteredValue="#{taskBean.filteredTasks}" var="row">
    <p:column headerText="Name" filterBy="#{row.name}" filterMatchMode="contains">
        <h:outputText value="#{row.name}" />
    </p:column>
    <!-- more columns here ... -->
</p:dataTable>