【问题标题】:Automatic trimming in QueryDSL with Bean Projection在 QueryDSL 中使用 Bean Projection 自动修剪
【发布时间】:2014-02-28 10:06:13
【问题描述】:

我有以下 QueryDSL 查询:

List<DTOPerson> names = query.from(p)
  .where(p.lastname.like("%smith%"))
  .orderBy(p.lastname.asc(), p.firstname.asc())
  .list(Projections.bean(DTOPerson.class, p.lastname, p.firstname));

我想要的是这样的:

List<DTOPerson> names = query.from(p)
  .where(p.lastname.like("%smith%"))
  .orderBy(p.lastname.asc(), p.firstname.asc())
  .list(Projections.bean(DTOPerson.class, p.lastname.trim(), p.firstname.trim()));

但是当我这样做时,QueryDSL 给了我这个错误:

java.lang.IllegalArgumentException: Unsupported expression trim(p.lastname)
  at com.mysema.query.types.QBean.createBindings(QBean.java:59)
  at com.mysema.query.types.QBean.<init>(QBean.java:149)
  at com.mysema.query.types.QBean.<init>(QBean.java:138)
  at com.mysema.query.types.Projections.bean(Projections.java:51)    

有没有办法修剪(所有)字符串结果?

【问题讨论】:

    标签: java querydsl


    【解决方案1】:

    在这种情况下,您需要使用显式别名,因为 Querydsl 只接受路径和别名操作作为 QBean 的参数。

    List<DTOPerson> names = query.from(p)
      .where(p.lastname.like("%smith%"))
      .orderBy(p.lastname.asc(), p.firstname.asc())
      .list(Projections.bean(DTOPerson.class, 
          p.lastname.trim().as("lastname"), 
          p.firstname.trim().as("firstname")));
    

    有没有办法修剪(所有)字符串结果?

    您可以创建自定义 FactoryExpression,例如QBean 的子类,来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2013-01-20
      • 2013-08-20
      • 2021-09-28
      • 2020-06-10
      • 2019-06-02
      相关资源
      最近更新 更多