Cayenne - 搜索依赖组合

Posted

技术标签:

【中文标题】Cayenne - 搜索依赖组合【英文标题】:Cayenne - Search for combination of dependencies 【发布时间】:2014-06-30 14:47:34 【问题描述】:

我正在创建一个允许用户创建表单的应用程序,该表单可以由其他用户加载和填写,然后可以查看该用户的提交。

表单中填充了字段。当用户填写表单时,会创建一个 Submission 数据库对象,并且此提交与 FieldValue 对象具有 1-M 关系。 FieldValue 对象具有字段的 FK,并存储用户输入的字符串。使用这种设计,为了查看提交,我阅读了与 Submission 关联的 FieldValues,并加载关联的 Field 对象,并用用户的输入填充它。从这个意义上说,一切都很好,但我的问题是搜索这些提交。

我正在一个搜索页面上工作,我在其中根据正在搜索的表单字段动态创建搜索字段。例如名字和姓氏。假设用户使用 firstName = j lastName = smith 进行搜索。使用这些搜索字段,我想搜索具有 FK 与 firstName 匹配且文本包含“j”的 FieldValue 并且具有 FK 与 lastName 匹配且文本包含“smith”的 DIFFERENT FieldValue 的所有提交>

我一直在尝试以下代码的变体:

 Expression exp = ExpressionFactory.matchExp(Submission.FORM_PROPERTY, _formId);

 for (SearchField searchField : searchFields)
                     
     Expression fieldExp = ExpressionFactory.matchExp(Submission.FIELD_VALUE_PROPERTY +"." + FieldValue.FIELD_PROPERTY, searchField.getFieldId());
     fieldExp = fieldExp.andExp(ExpressionFactory.likeIgnoreCaseExp(Submission.FIELD_VALUE_PROPERTY +"." + FieldValue.TEXT_PROPERTY, "%" + searchField.getText() + "%" ));

     exp = exp.joinExp(Expression.AND, fieldExp);                     
 
 SelectQuery query = new SelectQuery(Submission.class, exp);

我要做的是遍历每个搜索字段,并将其添加到必须在提交中的字段值列表中。这样做的问题是它一直在搜索具有所有这些值的 ONE FieldValue,因此显然失败了。我从未在另一个班级中进行过可能是 1-M 的搜索,所以我认为我在这里遗漏了一些东西。任何帮助将不胜感激。我为试图描述正在发生的事情的小小说道歉,但这对我来说有点不寻常。

【问题讨论】:

【参考方案1】:

您将需要构建一个创建 M 个连接的表达式。 “拆分”和“别名”控制how joins are generated。由于每个连接都有多个条件,因此拆分不起作用,因此使用显式别名更合适。让 SelectQuery know what each alias means.

import static org.apache.cayenne.exp.ExpressionFactory;

int len = searchFields.size();
String[] aliases = new String[len];
for (int i = 0; i < len; i++) 
     SearchField f = searchFields[i];
     aliases[i] = f.getFieldId();                  
     Expression e = matchAllExp(alias +"." + FieldValue.FIELD_PROPERTY, f.getFieldId());
     e = e.andExp(likeIgnoreCaseExp(alias +"." + FieldValue.TEXT_PROPERTY, "%" + f.getText() + "%" ));

     exp = exp.joinExp(Expression.AND, e);                     
 

 SelectQuery query = new SelectQuery(Submission.class, exp);
 query.aliasPathSplits(Submission.FIELD_VALUE_PROPERTY, aliases);

【讨论】:

非常感谢安德鲁斯!你是救生员。

以上是关于Cayenne - 搜索依赖组合的主要内容,如果未能解决你的问题,请参考以下文章

组合框依赖于另一个组合框 - JavaFX

以连续形式连接的组合框 - 如果依赖于第一个组合,第二个组合不会显示其值我该如何解决

ExtJS - 依赖组合框

Java组合实体模式~

Qt c++ 依赖组合框和依赖标签

关联组合聚合依赖关系比较 [转]