使用Bean Projection在QueryDSL中自动修剪

时间:2014-02-28 10:06:13

标签: java querydsl

我有以下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)    

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

1 个答案:

答案 0 :(得分:3)

在这种情况下,您需要使用显式别名,因为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的子类,要做到这一点。