Querydsl 空安全连接

Posted

技术标签:

【中文标题】Querydsl 空安全连接【英文标题】:Querydsl null-safe concatenation 【发布时间】:2013-02-05 08:00:49 【问题描述】:

假设您在表中有以下数据对应于类Person,那么安全地搜索字段name1name2 的连接的正确方法是什么?

@Entity
public class Person 
    Long id;
    String name1;
    String name2;
    // Getters and setters omitted for brevity

编号 |名称1 |名称2 ---------------------- 1 |福 |空值 2 |空 |酒吧 3 |福 |酒吧

默认情况下,如果其中一个为空,则连接两列会产生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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Querydsl 空安全连接的主要内容,如果未能解决你的问题,请参考以下文章

Oracle表与表之间的连接方式(内连接:inner join 外连接 全连接: full outer join左连接:left outer join 右连接:right outer join(代码

你知道TCP的半连接与全连接队列吗?

TCP 半连接队列和全连接队列

mysql laravel 可以外连接还是全连接?

全外连接与全连接

TCP半连接队列和全连接队列(史上最全)