Criteria Api: 如果第一个为空,则在多选中使用另一个参数
Criteria Api: Use another parameter in multiselect, if the first one is null
我有一个 POJO class 人,它有两个字段。让我们假设只有其中一个拥有一个值,另一个是 always null
public class Person {
private String music;
private String sports;
...
}
我想通过标准 Api 将一个或另一个填充到 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();
有没有办法将 music 或 sports 用于多选,具体取决于它们中的哪一个对于当前的不为空记录。
或者我必须定义一个子查询来实现这种行为吗?
您正在查找 COALESCE
表达式(请参阅规范中的第 "Query Language" 章第 "Case Expressions" 段)。
Create an expression that returns null if all its arguments evaluate to null, and the value of the first non-null argument otherwise.
相应的标准API 是CriteriaBuilder.coalesce()
组方法。选择单个字符串非常简单:
query.select(cb.coalesce(musicPath, sportsPath));
如果你想要 PersonDTO
当然,你将不得不使用 CriteriaBuilder.construct()
方法 和适当的构造函数 :
query.select(cb.construct(PersonDTO.class, cb.coalesce(musicPath, sportsPath), ...));
我有一个 POJO class 人,它有两个字段。让我们假设只有其中一个拥有一个值,另一个是 always null
public class Person {
private String music;
private String sports;
...
}
我想通过标准 Api 将一个或另一个填充到 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();
有没有办法将 music 或 sports 用于多选,具体取决于它们中的哪一个对于当前的不为空记录。 或者我必须定义一个子查询来实现这种行为吗?
您正在查找 COALESCE
表达式(请参阅规范中的第 "Query Language" 章第 "Case Expressions" 段)。
Create an expression that returns null if all its arguments evaluate to null, and the value of the first non-null argument otherwise.
相应的标准API 是CriteriaBuilder.coalesce()
组方法。选择单个字符串非常简单:
query.select(cb.coalesce(musicPath, sportsPath));
如果你想要 PersonDTO
当然,你将不得不使用 CriteriaBuilder.construct()
方法 和适当的构造函数 :
query.select(cb.construct(PersonDTO.class, cb.coalesce(musicPath, sportsPath), ...));