java - Querydsl 空安全串联

标签 java database null data-access-layer querydsl

假设您在对应于类 Person 的表中有以下数据,对于 name1 字段的串联,安全搜索 null 的正确方法是什么>name2?

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

By default the concatentation of two columns results in null if either is 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)
}

以上代码产生以下列表:

null
null
FooBar

最佳答案

一种简单的方法是使用 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();
}

将产生以下列表:

Foo
Bar
FooBar

关于java - Querydsl 空安全串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14977812/

相关文章:

java - 为什么我没有收到 NullPointerException

clojure - 为什么Clojure之父说Scheme的true/false坏了?

mysql - 删除MySQL中特定数据库中用户的所有权限

mysql - 在 MySQL 中强制区分大小写的问题

java - 为什么 `exception` 在任何地方都看不到?

java - JVM 虚拟线程的可调整大小堆栈是多少?

java - Spring注入(inject)接口(interface)实现

java - 找不到类 'twitter4j.http.AccessToken'

java - 无法让瓷砖与 spring mvc 3 一起使用

database - 将数据行移动到另一个分片的最佳方法?