使用OpenXava如何自定义列表视图展示的实体及关联属性?
Recapito列表视图自定义字段配置实现
默认列表仅展示关联Contatto的nome属性,是JPA实体自动渲染框架的内置规则,可通过以下方式按需配置展示内容,包括指定要展示的关联实体属性:
你当前定义的Recapito实体代码如下:
@Entity @Getter @Setter public class Recapito extends AceArcId implements Serializable { private static final long serialVersionUID = 1L; @ManyToOne(fetch=FetchType.LAZY, optional=false) private Contatto contatto; @Column(length=254) private String email; @Column(length=254) private String telefono; @Column(length=254) private String sito; @Column(length=254) private String paginaSocial; @Column() private Date data; }
默认列表渲染效果如下:
具体实现方式
1. 独立列表配置类声明展示字段(推荐)
绝大多数JPA低代码/自动渲染框架支持通过独立的视图配置类显式声明列表展示字段,不需要修改原有实体代码:
- 实体自身的属性直接填写属性名即可,例如
email、telefono、sito、paginaSocial、data - 关联实体的属性通过点路径穿透指定,例如需要展示
Contatto的codiceFiscale、indirizzo属性,直接配置为contatto.codiceFiscale、contatto.indirizzo,框架会自动关联查询对应字段完成渲染 - 可自由调整字段展示顺序、列宽、表头显示别名
以JHipster生态的配置为例,逻辑完全通用:
public class RecapitoListViewConfig { // 按顺序声明列表要展示的所有字段 public static final List<String> DISPLAY_COLUMNS = List.of( "contatto.nome", "contatto.codiceFiscale", "email", "telefono", "data" ); }
2. 实体字段注解控制可见性
如果使用的框架支持字段级视图注解,可直接在Recapito实体上添加配置注解,标记字段是否需要在列表展示、关联字段需要穿透的子属性:
@Entity @Getter @Setter public class Recapito extends AceArcId implements Serializable { private static final long serialVersionUID = 1L; // 关联字段指定列表中要展示的Contatto子属性 @ManyToOne(fetch=FetchType.LAZY, optional=false) @ListViewColumn(embeddedColumns = {"nome", "citta"}) private Contatto contatto; // 标记需要在列表展示的自有字段 @ListViewColumn @Column(length=254) private String email; @ListViewColumn @Column(length=254) private String telefono; // 未加注解的字段默认不在列表展示 @Column(length=254) private String sito; }
3. 自定义列渲染
如果需要对关联实体的展示内容做灵活拼接(例如将Contatto的姓名、城市拼接为“张三-上海”格式),可实现自定义列渲染逻辑,替代框架默认的属性展示规则,灵活度最高。
开发注意事项
- 由于
contatto字段配置了FetchType.LAZY懒加载,需在列表数据查询层通过join fetch预加载关联对象,避免加载列表时出现N+1次SQL查询的性能问题 - 所有列表展示配置可全部在
Recapito的视图层完成,不需要修改Contatto实体的原有代码,不会影响其他业务场景的使用
内容的提问来源于stack exchange,提问作者javierpaniza
相关产品推荐
相关产品推荐

