是的,唯一的选择是使用 Expando AKA 自定义属性/字段。在 fileEntry 的情况下,您不需要以编程方式创建表和列,但您可以在控制面板 > 自定义字段中进行设置。
之后,您有一些选择如何填充 expando 值。
fileEntry.getExpandoBridge().setAttribute("propName", "propValue")
或者如果您从视图层获取属性
<liferay-ui:custom-attributes-available className="<%= DLFileEntry.class.getName() %>">
<liferay-ui:custom-attribute-list
className="<%= DLFileEntry.class.getName() %>"
classPK="<%= (fileVersion != null) ? fileVersion.getFileVersionId() : 0 %>"
editable="<%= true %>"
label="<%= true %>"
/>
</liferay-ui:custom-attributes-available>
进而
ServiceContext serviceContext = ServiceContextFactory.getInstance(
DLFileEntry.class.getName(), actionRequest);
serviceContext 由 actionRequest 中的参数填充,然后您只需调用
fileEntry.getExpandoBridge().setAttributes(serviceContext)
最后,您可能需要查询具有特定属性的文件条目
public Hits search() {
Map<String, Serializable> attributes = new HashMap<String, Serializable>();
attributes.put("propertyName", "propertyValue");
SearchContext searchContext = new SearchContext();
searchContext.setAttributes(attributes);
Indexer indexer = IndexerRegistryUtil.getIndexer(FileEntry.class);
return indexer.search(searchContext);
}
当然,这个解决方案可能看起来有点复杂,因为 Liferay 文档库不是 JCR 内容存储库,但它实际上是一个文档库,通过 Hooks 为具体的 repo 实现提供抽象层,例如 JCRHook(其中文件存储到 jackrabbit 存储库)、CMIS 支持、迁移支持等。它还处理权限检查、文件版本控制、文档工作流和资产管理。
因此,如果您打算做一些更复杂的事情,您将不得不查询属性/元数据,更改它们并展开它们。您应该考虑直接使用 JCR 存储库...