Java Criteria Api:如果第一个参数为空,请在multiselect中使用另一个参数

Java Criteria Api:如果第一个参数为空,请在multiselect中使用另一个参数,java,jpa,criteria-api,Java,Jpa,Criteria Api,我有一个POJO类的人,有两个字段。假设其中只有一个值,另一个值始终为null public class Person { private String music; private String sports; ... } 我想通过CriteriaAPI将其中一个或另一个填充到DTO列表中。 以下是我的(不完整的)Dao代码片段: CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Per

我有一个POJO类的人,有两个字段。假设其中只有一个值,另一个值始终为null

public class Person {
     private String music;
     private String sports;
     ...
}
我想通过CriteriaAPI将其中一个或另一个填充到DTO列表中。 以下是我的(不完整的)Dao代码片段:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<PersonDTO> query = cb.createQuery(PersonDTO.class);
Root<Person> root= query.from(Person.class);

Path<String> musicPath = root.get(Person_.music);
Path<String> sportsPath= root.get(Person_.sports);

query.multiselect(/** TODO */);

List<PersonDTO> results = em.createQuery(query).getResultList();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(PersonDTO.class);
Root=query.from(Person.class);
路径musicPath=root.get(Person.music);
Path SPORSTPATH=root.get(Person.sports);
query.multiselect(/**TODO*/);
List results=em.createQuery(query.getResultList();
是否有一种方法可以在multiselect中使用music Order sports,具体取决于当前记录中哪一个不为空。
或者我必须定义一个子查询来实现此行为吗?

您正在寻找
合并表达式(请参阅规范中的“查询语言”一节中的“案例表达式”)

创建一个表达式,如果其所有参数的值都计算为null,则返回null,否则返回第一个非null参数的值

相应的标准API是
CriteriaBuilder.coalesce()
方法集。选择单个字符串非常简单:

query.select(cb.coalesce(musicPath, sportsPath));
当然,如果您想要
PersonDTO
,您必须使用
CriteriaBuilder.construct()
方法和适当的构造函数:


非常感谢你,coalesce成功了!“construct”方法不是必需的,我只是做了一个:query.multiselect(cb.coalesce(musicPath,sportsPath),…)
query.select(cb.construct(PersonDTO.class, cb.coalesce(musicPath, sportsPath), ...));