动态获取特定列



我有以下用户实体:

public class User extends PanacheEntityBase{
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DataIdGenerator")
@Column(name = "id")
public Long id;
public String name;
public String location;
public int age;
}

我还有以下端点:'/user',带有'select'查询参数,其中提供您想要接收的列名。应该可以选择列的任意组合,如:/user?select=id,name,/user?select=id,age,/user?select=name,age,/user?select=age,name

基于'select'查询,我想使用一个投影来获取所选的列。目前,我正在使用查询创建以下查询fe:/user?select=id,nameSELECT d.id, d.name FROM User d,但是我需要DTO根据所提供的列也是动态的。

目前我有以下投影,其中UserDTO是一个具有id和name属性的类。这很好,但如果我改变任何参数,我需要一个不同的DTO。

// This variable is dynamically created based on query parameters
String query = 'SELECT d.id, d.name FROM User d'
return User.find(query).project(UserDTO.class).list();

是否有可能使这个投影DTO类更动态,所以它支持所有的组合?

我怀疑Panache API目前还不够灵活,无法满足您的要求。

但是你可以使用没有Panache的Hibernate响应式API:

@Inject
Mutiny.SessionFactory sf;
public Uni<List<Tuple>> find(String query) {
return sf.withSession(session ->
session.createQuery(query, Tuple.class).getResultList()
);
}

一旦你有了Tuple,你就可以把它转换成你喜欢的类型。

看起来您已经在JPA层有了您的解决方案。诀窍是只序列化从端点返回的请求信息。

您可以投影到具有所有UserDTO上您希望将实体的字段公开为可空值(例如,使用相同的结构,但对age使用Integer而不是int)。我认为你需要在这个DTO上为你想要的所有值的组合创建构造函数(每个构造函数都会将其他值保留为null)。

然后,您可以将DTO注释为@JsonInclude(JsonInclude.Include.NON_NULL),以使Jackson序列化器仅在端点的响应中生成非空字段。

我希望这是不言而喻的,但我还是要说:既然您允许用户生成的输入来修改您的查询,那么您应该为此清理输入。

相关内容

  • 没有找到相关文章

最新更新