Freemarker:在数组数组中查找特定对象

时间:2018-01-26 19:19:55

标签: html jpa spring-data-jpa freemarker

我定义了一个复杂的多对多关系。交叉引用表是一个实体,因此我与一对多联系人联系列表,并与一对多联系人列表联系。联系人列表包含listID,contactID和一些布尔值。这些关系似乎运作良好,在后端我可以使用Spring-Data-Jpa findByContactListsIn(Set)获取评论列表中的联系人列表。

但是,我正在尝试在Freemarker中构建一个联系人列表,并显示它们是否在当前列表中。

在我用ContactList创建一个实体之前,我之间有一个标准的“多对多”关系,我能够在我的.ftl中做到这样的事情:

<#if list.contacts?seq_contains(contact)>

但是我需要专门为ContactList添加一些数据,所以我需要它更复杂。我现在该怎么办?我试过了:

<#if list.contactLists?seq_contains(contact)

但当然总是返回false,因为它正在比较两种不同的实体类型。有没有办法找到联系人是否在其中一个contactList对象中?

我想我可以做一些后端技巧,但我正在寻找一个前端解决方案。

1 个答案:

答案 0 :(得分:2)

根本不要使用?seq_contains来查找通用对象。它不会调用Object.equals,而是像模板语言的==运算符一样工作,它只允许比较字符串,数字,布尔值和日期/时间,否则会给您一个错误。不幸的是,在你的情况下它不会失败,因为POJO-s也是字符串(它们的字符串值是toString()返回的)。这是股票ObjectWrapper的遗留遗产(计划在FM3中修复);甚至在模板语言中都没有怪癖。理想情况下,你会遇到错误。相反,现在它默默地比较toString() - s ...

的返回值

您的数据模型应该已包含模板应实际显示的内容。 FTL不是一种编程语言,所以如果你尝试从其中的数据模型中提取它,那将是一种痛苦。但是,数据模型包含数据也意味着数据模型中的某些对象具有提取所需数据的方法。作为最后的手段,您可以添加仅包含辅助方法的对象。

更新:返回?seq_contains,如果需要Java语义且list是Java Collection,则可以使用Java API:list?api.contains(contact)