2012-05-28 38 views
3

我想創造出檢查where子句,如果存儲在列中的值(這是在「Q」級認定爲創建Querydsl where子句來檢查時間戳列

public final DateTimePath<java.sql.Timestamp> startDate = createDateTime("StartDate", java.sql.Timestamp.class); 

) 大於或等於提供的值。

該值提供的時間很長,但(自然地)我可以在檢查之前創建任何必要的數據類型。

我曾嘗試以下:

{ 
.... 
final QViewVETFullList fullList = QViewVETFullList.viewVETFullList; 

.... 
final String startDate = "28.05.2012"; // test data 
final BooleanExpression startDateExp = getDateGTEExpression(fullList.startDate, startDate); 

..... 
query = query.from(fullList); 
query = query.where(startDateExp); // this is where it falls over 

... 

} 

    public static BooleanExpression getDateGTEExpression(
     DateTimePath<Timestamp> path, String dateStr) { 

      // this seems to be the problem?? 
    final DateTimePath<Timestamp> datePath = Expressions.dateTimePath(
      java.sql.Timestamp.class, dateStr); 

      // this syntax works successfully with other data types 
    return BooleanOperation.create(Ops.GOE, path, datePath); 
} 

代碼編譯並運行到這裏的「其中」添加子句點。 它然後用下面的倒下:

.... 
Caused by: java.lang.IllegalArgumentException: Undeclared path 28.05.2012 
at com.mysema.query.types.ValidatingVisitor.visit(ValidatingVisitor.java:48) 
at com.mysema.query.types.ValidatingVisitor.visit(ValidatingVisitor.java:10) 
at com.mysema.query.types.path.DateTimePath.accept(DateTimePath.java:46) 
at com.mysema.query.types.ValidatingVisitor.visit(ValidatingVisitor.java:101) 
at com.mysema.query.types.ValidatingVisitor.visit(ValidatingVisitor.java:36) 
at com.mysema.query.types.ValidatingVisitor.visit(ValidatingVisitor.java:10) 
at com.mysema.query.types.expr.BooleanOperation.accept(BooleanOperation.java:44) 
at com.mysema.query.DefaultQueryMetadata.validate(DefaultQueryMetadata.java:296) 
at com.mysema.query.DefaultQueryMetadata.addWhere(DefaultQueryMetadata.java:138) 
at com.mysema.query.support.QueryMixin.where(QueryMixin.java:375) 
at com.mysema.query.support.QueryBase.where(QueryBase.java:44) 
at com.***.***.***.***.***DAOBean.get*****(***tDAOBean.java:185) 

我會就此事的任何想法感謝。

+0

您的問題有何進展? –

回答

1

您嘗試將常量28.05.2012變成路徑。路徑用於變量和屬性。另一個問題是,你想比較一個時間戳到一個字符串。在我看來,最好的選擇是從你的String常量中構造一個Timestamp並比較它的路徑。

不安全的事情會

query.from(fullList) 
    .where(fullList.startDate.stringValue().goe("28.05.2012")) 

但這取決於日期的序列化到字符串/ VARCHAR處理在數據庫級別上。

另外Querydsl查詢是可變的,所以不需要一直重新分配它們。