为什么字段没有显示中文
使用 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
显示中文有多种方式
- 使用 @Dict 注解声明字典
- 使用 ManyToOne 关联其他模型
- 使用 @Selection 关联其他模型
- 使用 @Selection 执行 method 动态查询值
- 使用 @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);
}