Querydsl null-safe concatenation

RJo*_*RJo 4 java database null data-access-layer querydsl

假设你有相应的类在表中的以下数据Person,什么是搜索空安全地场的串联的正确方法name1name2

@Entity
public class Person {
    Long id;
    String name1;
    String name2;
    // Getters and setters omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
id |  name1  | name2   
------------------------
1  |  Foo    | null
2  |  null   | Bar
3  |  Foo    | Bar

默认情况下,两列的连接将导致nullif为null.

public List<String> nameConcatenations() {
    JPAQuery q = new JPAQuery(entityManager);
    QPerson person = QPerson.person;
    StringExpression nameConcatenation = person.name1.concat(person.name2);
    return q.from(person).list(nameConcatenation)
}
Run Code Online (Sandbox Code Playgroud)

以上代码导致以下列表:

null
null
FooBar
Run Code Online (Sandbox Code Playgroud)

RJo*_*RJo 10

一种简单的方法是使用SQL的COALESCE函数,它具有Querydsl中的等价函数

public List<String> nameConcatenations() {
    JPAQuery q = new JPAQuery(entityManager);
    QPerson person = QPerson.person;
    StringExpression nameConcatenation = emptyIfNull(person.name1)
        .concat(emptyIfNull(person.name2));
    return q.from(person).list(nameConcatenation)
}

private static StringExpression emptyIfNull(StringExpression expression) {
    return expression.coalesce("").asString();
}
Run Code Online (Sandbox Code Playgroud)

将产生以下列表:

Foo
Bar
FooBar
Run Code Online (Sandbox Code Playgroud)