私は休止状態と jsf テクノロジを初めて使用し、データベースから値を取得して更新する (ユーザーが値を変更した場合) ピックリストを作成しようとしています。
私のデータベーススキーマは次のとおりです。
Hibernate Data Model に実装されたテーブル「imtype_variable」を介して多対多の関係を持つ 2 つのテーブル (エンティティ) CRImageType(ImTypeId(PK),ImTypeName,ImTypeDescription) & CRVariable(VarId(PK),VarName,VarDescription) があります。
モデルはうまく機能しているようです。テーブルCRVariableとCRImageTypeを読み書きするために、jsf要素(挿入、編集、削除ボタンのあるデータテーブル+対応するダイアログボックス+ Beanクラス)を使用することもできます。
CRImageType を CRVariable レコードに関連付けるために、ピックリストも必要です。私のビジネス シナリオは、画像タイプを 1 つ以上の変数 (医学用語) に再関連付けできるようにすることなので、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」バックビーンでは、ピックリストにデータを入力するために次のメソッドを実装しました(オンラインのプライムフェイスのデモに従って):
@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;
}
バック Bean メソッド '' は正常に動作しているように見えます。これは、コンソールに正しいリスト項目オブジェクト (source1 と target) が設定されており、次の行 (コンソール出力) に示すように Dual List Model オブジェクトが返されるためです。
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」を使用すると、バックビーンでゼロ値として渡されます!!!
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
私が行方不明になっているもののアイデアはありますか???