为什么字段没有显示中文

使用 ManyToOne,但是 One 方没有字段标记 displayForModel

例如订单关联物料,我们想要在订单列表显示物料的中文名

首先物料需要声明使用哪个字段来作为中文名显示

@Model
public class Material extend BaseModel<Material> {
    
    @Property(displayForModel = true)
    private String name;
}

@Model
public class Order extend BaseModel<Order> {
    
    @ManyToOne
    @JoinColumn
    private Material material;
}

确保调用 search 的时候,meta 的 arguments 包含 useDisplayForModel = true

显示中文有多种方式

  1. 使用 @Dict 注解声明字典
  2. 使用 ManyToOne 关联其他模型
  3. 使用 @Selection 关联其他模型
  4. 使用 @Selection 执行 method 动态查询值
  5. 使用 @Property 的 computeMethod 动态计算值

为了方便前端查询中文值,前端每次请求都会传入一个参数 useDisplayForModel = true。 但是引擎出于性能考虑(上面的方式会涉及到表关联或者方法调用),在每一次调用完查询后, 都会将 useDisplayForModel 这个标识删除。

所以如果你重写了 search 方法,例如

public List<Material> search(Filter filter, List<String> properties, Integer limit, Integer offset, String order) {
    
    // 调用了其他模型的 search 方法
    getMeta().get("other_model").search();
    
    // 最后调用了本模型的 search 方法
    // 由于上一步的查询,meta 里面 useDisplayForModel 标识被删除了
    // 所以下面 search 的时候,引擎不会去做关联查询、或者调用 computeMethod
    return super.search(filter, proerties, limit, offset, order);
}

你可以明确指定 useDisplayForModel = true

public List<Material> search(Filter filter, List<String> properties, Integer limit, Integer offset, String order) {
    
    // 调用了其他模型的 search 方法
    getMeta().get("other_model").search();
    
    // 最后调用了本模型的 search 方法
    // 由于上一步的查询,meta 里面 useDisplayForModel 标识被删除了
    getMeta().addArgument(MetaConstant.USE_DISPLAY_FOR_MODEL, true);
    return super.search(filter, proerties, limit, offset, order);
}

查询的时候 properties 是 *

public List<Material> search(Filter filter, List<String> properties, Integer limit, Integer offset, String order) {
    
    getMeta().addArgument(MetaConstant.USE_DISPLAY_FOR_MODEL, true);
    // 如果 properties 是 *,那么引擎也不会去做关联查询,或调用 computeMethod
    return super.search(filter, Arrays.asList("*"), limit, offset, order);
}