0

我是 hibernate 和 jsf 技术的新手,我试图有一个从数据库中检索和更新(如果用户更改其值)值的选择列表。

我的数据库架构如下:

我有两个表(实体)CRImageType(ImTypeId(PK),ImTypeName,ImTypeDescription) 和 CRVariable(VarId(PK),VarName,VarDescription),它们通过在我的 Hibernate 数据模型中实现的表 'imtype_variable' 具有多对多关系。

该模型似乎工作正常。我还可以使用 jsf 元素(带有插入、编辑和删除按钮的数据表 + 相应的对话框 + bean 类)来读取和写入表 CRVariable 和 CRImageType。

我还希望有一个选择列表,以便能够将 CRImageType 与 CRVariable 记录相关联。我的业务场景是能够将图像类型与一个或多个变量(医学术语)重新关联,因此我使用的是 jsf 选项列表:

<p:dialog id="dialog-associatevariables" header="Associate Variables" widgetVar="dlg7"     dynamic="true" showEffect="fade">
<h:panelGrid id="associateVariables" columns="1" cellpadding="4">
<p:pickList id="pickList" 
                value="#{reportConfiguratorBean.getAssocImTypVariables(reportConfiguratorBean.selectedCRImageType.imTypeId)}"
                var="cRVariable" 
                itemValue="#{cRVariable}" 
                itemLabel="#{cRVariable.varName}">
    <f:facet name="sourceCaption">Available Variables</f:facet>
        <f:facet name="targetCaption">Associated Variables</f:facet>
</p:pickList>
</h:panelGrid>  
</p:dialog>

在我的“reportConfigurator”backbean 中,我实现了以下方法来填充选择列表(按照在线 primefaces 演示):

@SuppressWarnings("unchecked")
public DualListModel<CRVariable> getAssocImTypVariables(Long imTypeId)     {

List<CRVariable> source1;
List<CRVariable> target;
...         
String hq3 = "select distinct v from CRVariable v join v.crimagetypes t where t.id in (:itid)";
Query query3 = session.createQuery(hq3);
query3.setParameter("itid",imTypeId);
target = query3.list();
System.out.println("Associated Variables with Id: " + target);          
String hq4 = "select v FROM CRVariable v WHERE v.id not in (" +
            "select distinct v1.id " +
            "from CRVariable v1 " +
            "join v1.crimagetypes t2 " +
            "where t2.id in (:itid))";
Query query4 = session.createQuery(hq4);
query4.setParameter("itid",imTypeId);
source = query4.list();
System.out.println("Non Associated Variables with Id: " + source);
String hq5 = "FROM CRVariable";
Query query5 = session.createQuery(hq5);
source1 = query5.list();
System.out.println("Non Associated Variables with Id: " + source1);         
dualListVars = new DualListModel<CRVariable>(source1, target);          
System.out.println("Dual List Model: " + dualListVars);
...
{
session.close();
}
return dualListVars;
}

Back bean 方法 '' 似乎工作正常,因为在我的控制台中填充了正确的列表项对象(源 1 和目标),它返回一个双列表模型对象,如下行所示(控制台输出):

Associated ImageType with Id: 26
...
Associated Variables with Id: [varId : 75, varName : Ki67(X), varDescription : Ki67(X)]
Non Associated Variables with Id: [varId : 71, varName : ER (X), varDescription : ER (X), varId : 72, varName : HER2(X), varDescription : HER2(X), varId : 73, varName : IHC, varDescription : IHC, varId : 74, varName : FISH, varDescription : FISH, varId : 76, varName : PTEN(X), varDescription : PTEN(X), varId : 77, varName : Histology (X), varDescription : Histology (X)]
...
Non Associated Variables with Id: [varId : 71, varName : ER (X), varDescription : ER (X), varId : 72, varName : HER2(X), varDescription : HER2(X), varId : 73, varName : IHC, varDescription : IHC, varId : 74, varName : FISH, varDescription : FISH, varId : 75, varName : Ki67(X), varDescription : Ki67(X), varId : 76, varName : PTEN(X), varDescription : PTEN(X), varId : 77, varName : Histology (X), varDescription : Histology (X)]
...

Τ他的问题是**当我调用选项列表对话框时,选项列表列没有正确填充......

经过一些调试/研究后,我认为这与我调用我的选择列表方法“reportConfiguratorBean.getAssocImTypVariables(...)”的方式有关。

如果我使用“reportConfiguratorBean.selectedCRImageType.imTypeId”作为方法参数,它会在 backbean 中作为零值传递!!!

如果我硬编码一个整数作为参数,例如 25选择列表会正确填充,但在控制台中我可以看到以下异常:

ERROR class java.lang.IllegalArgumentException: can't parse argument number reportConfiguratorBean.getAssocImTypVariables(25): javax.el.PropertyNotWritableException: /views/report-configurator.xhtml @271,10 value="#{reportConfiguratorBean.getAssocImTypVariables(25)}": Illegal Syntax for Set Operation

关于我错过了什么的任何想法???

4

1 回答 1

0

经过一些研究和调试后,我的选择列表组件似乎无法接受 (value="#{reportConfiguratorBean.getAssocImTypVariables(reportConfiguratorBean.selectedCRImageType.imTypeId)}") 需要传递参数的方法......我重新实现了“ " 方法(我的后台 bean 现在是 Session 范围的)为:

public DualListModel<CRVariable> getAssocImTypVariables() {
    Long imTypeId = Long.parseLong(virtualId);
...

我的选择列表已填充...

其中 virtualId 是一个全局字符串变量,填充了 selectedItem Id ...

于 2012-11-08T15:22:08.450 回答