0

我想在列表模式下过滤 OpenXava 中的标签。


  1. 因此我有一个名为Tag ( with int id, String name and String description)的简单实体

  2. 我有一个嵌入式 Entity Details,它包含标签引用,如下所示:

@Embeddable
public class Detail {

@ManyToOne(fetch = FetchType.LAZY, optional = true)
private Tag tag;

public Tag getTag() {
    return tag;
}

public void setTag(Tag tag) {
    this.tag = tag;
}

@Override
public String toString() {
    return tag.getName();
    
}
  1. 我的“主要”实体,称为Target,代表一个对象,它应该能够用标签进行标记。

因此有一个详细信息集合,将标签分配给目标,这在列表模式中无法表示

@Tab(name="TargetTab", editors="List", properties="id, tags, manufacturer.name, owner.name, protocolID, idCreationDate, simDBID, remark, changeDate, photo, xphoto")
@Entity
public class Target implements Serializable {

...

@ElemtentCollection
@ListProperties("tag.number, tag.name, tag.description")
@Embedded
Collection<Detail> details;

    public Collection<Detail> getDetails() { 
        return details;
    }

    public void setDetails(Collection<Detail> details) { 
        this.details = details;
        tags = details.toString().substring(1, details.toString().length() - 1);
    }

...

为了在列表模式中表示标签,我创建了一个字符串,其中填充了标签的名称

...
@ReadOnly
String tags;

...

这会在列表模式中创建一个“标签”列,它由一个字符串表示,例如:“a,b,c,d”

为了在列表模式下过滤,OpenXava 默认有一个输入框,您可以在其中输入一个字符串,如:“a,b”,以获取所有带有标签“a”和“b”的条目

但是,如果我输入“a,c”,则不会显示任何结果,即使有带有标签“a,b,c,d”的条目

我的目标/问题:

我想要一个灵活的过滤器,我可以在其中输入如下内容:“a,c”并获取包含标签“a”和“c”的所有条目

我尝试通过 Target 实体中的"TagFilter.class"with来实现它"baseCondition="${tags} = ?",但没有可用的结果

4

1 回答 1

0

Target 中的 tags 属性与 details 集合的标签值无关。Target 中的 tags 属性只是表中的一个新列。

你必须选择:

  1. 使用@Formula 定义标签属性
  2. 每次添加/删除细节时更新 tags 属性(您可以使用 JPA 回调方法)
于 2020-02-18T13:53:22.040 回答