3

値が列に格納されているかどうかを調べるwhere句を作成しようとしています(「Q」クラスで次のように識別されます)

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

) は指定された値以上です。

値は long として提供されますが、(当然のことながら) 調べる前に必要なデータ型を作成できます。

私は次のことを試しました:

{
....
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 );
}

コードはコンパイルされ、「where」句が追加されるポイントまで実行されます。その後、次のようにフォールオーバーします。

....
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)

この件についてご意見をお寄せいただければ幸いです。

4

1 に答える 1

2

定数 28.05.2012 をパスに変換しようとしています。パスは、変数とプロパティに使用されます。もう 1 つの問題は、Timestamp を String と比較したいということです。私の意見では、最善の選択肢は、String 定数からタイムスタンプを作成し、パスを比較することです。

安全でないことは

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

ただし、これは、データベース レベルで日付が Strings / varchars にシリアル化される方法によって異なります。

また、Querydsl クエリは可変であるため、常に再割り当てする必要はありません。

于 2012-05-28T19:36:19.613 に答える