2

ドメイン フィールド:

startDate: Date
length: Integer
perpetuity: Boolean
expiryDate: Transient (startDate + length (in years))

ドメイン メソッド - これらのメソッドは、ユーザーが 4 つの異なる有効期限ステータスを検索するための大きなフィルター フォームでのフィルター処理に使用されます。

Date getExpiryDate() {
    if (this.startDate == null || this.length == null) {
        return null
    }

    Timestamp startDate = this.startDate;
    Calendar expirationDate = Calendar.getInstance()
    expirationDate.setTime(startDate)
    expirationDate.add(Calendar.YEAR, this.length)

    return expirationDate.getTime()
}

String getMechExpiredStatus() {
    String isExpiredString = 'Unspecified'
    Date expDate = getExpiryDate()
    if (expDate != null) {
        if (expDate < new Date()) {
            isExpiredString = 'Yes'
        } else {
            isExpiredString =  'No'
        }

    } else if (isPerpetual && startDate != null) {
        isExpiredString =  'Perpetual'
    }

    return isExpiredString
}

結果リストの作成

PagedResultList getMechanisms(offset, max, sortColumn, sortOrder, filters, idsOnly = false) {
    def criteria = Mechanism.createCriteria()
    def results = criteria.list(max: max, offset: offset) {
        if (idsOnly) {
            projections {
                property('id')
            }
        }

        if (filters && filters.idFilter) {
            eq('id', filters.idFilter);
        }
    ...
    }

    if (filters && filters.expiredFilter != null && filters.expiredFilter) {
        // Do Work
        // Tried getting results and removed invalid results that do not meet the 
        // expired filter selection
    }

return results

}

一時フィールド「expiryDate」または getMechExpiredStatus メソッドを使用して createCriteria を記述する方法が見つからないようです。

他のフィルターを使用してアイテムのリストを取得してから、有効期限フィルターで無効なアイテムを個別に削除しようとしましたが、PagedResultList が適切に更新されません。現在のページ化された結果リストを返すだけです。PagedResultList オブジェクトに関するヘルプもあまり見つかりません。Remove と Add は何らかの理由でブール値を返します。どうやら私はオブジェクトをよく理解していません。

最初の基準リストから最大値とオフセットを削除すると、クエリの実行に非常に長い時間がかかります。

これを達成する方法はありますか?

4

2 に答える 2

2

ビューで有効期限のステータスと日付を作成し、それをドメイン オブジェクトにリンクするだけで問題を解決しました。よく働く!

于 2014-08-22T22:13:09.577 に答える
1

一時プロパティに対してクエリを実行することはできません。定義上、一時的なプロパティはデータソースには存在しないため、データソースによって実行されるクエリの一部にすることはできません。

一時的なプロパティを使用して目的を達成するには、データソースが提供する制限機能とオフセット機能を使用せずに独自の結果リストを作成し、結果をフィルタリングしてから、オフセットと制限を自分で適用する必要があります。

あなたのクエリが何であるかの例を提供していないので、私は例のために自分自身を作るために残されています:

// this could be any type of query, using list for simplicity of the example
def databasePersons = Person.list()
// assumes anAdult is a boolean transient property of person
// calculated based on age
def filteredPersons = databasePersons.findAll{ it.isAnAdult() }

// get rid of the first X records, the offset
filteredPersons = filteredPersons.drop(offset)

// only take the next X remaining records, the max
filteredPersons = filteredPersons.take(max)
于 2014-08-21T22:34:27.400 に答える