我正在使用JPA条件构建器来查询数据库中的记录。但是,我想使用JPA条件API从表中返回特定列。
当前,我的实现返回完整对象。但是,我只想返回特定的列,这些列可以是动态的。 下面的代码将在Person表上查询并返回Person的完整对象。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> query = cb.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
query.select(cb.equal(root.get("id"), 1));
TypedQuery<Person> result = em.createQuery(query);
List<Person> personList = result.getResultList();
我知道我们可以创建一个类似PersonMini的精简类,该类仅包含如下所示的特定字段,但就我而言,这些列可以是动态的,并且可以基于用户的偏好。
class PersonMini {
private long id;
private String name;
// .. constructor and getter/setter
}
创建单独的迷你类Person是不可行的。有没有人解决过这样的问题,或者如果可以解决我的问题,请提出另一种方法。
编辑:
如here中所述。
如果某个用户定义的类X的条件查询的类型为CriteriaQuery(即,通过将X类参数传递给createQuery方法创建的条件查询对象),则传递给multiselect方法的列表元素将传递给 X构造函数,并将为每一行返回X类型的实例。
如果我使用 multiselect 方法并使用 PersonMini 类,则每个字段的每个组合都需要一个构造函数。因为字段的选择是由用户完成的。选择字段不是静态的。
假设,在PersonMini类中,我有3个字段。 Id,名称和城市,然后用户可以选择 Id和名称,名称和城市,城市(单独) , Id(单独), Id和城市。对于每种组合,我都需要构造函数,否则它将抛出错误运行时。
对于两三个字段,可以使用不同的构造函数组合,但对于15-20个字段则不行。