6

アソシエーションで QBE を使用できないのは非常にイライラします。

約 8 つの多対 1 列を持つ大きなデータテーブルがあります。テーブルをフィルタリングするためのすべての列のドロップダウン リストがあります。

次のように仮定します。

テーブル ユーザー

User { id, UserStatus, UserAuthorization }

このコードを使用したい:

Criteria crit = getSession().createCriteria(class);
crit.add(Example.create(userObject));

これは、次の例では機能しませんuserObject

User id=1 { UserStatus=Active, UserAuthorization=Admin }

QBE はコレクションをサポートしていないためです。

これを解決する 1 つの方法は、次のように使用することです。

crit.createCriteria("UserStatus").add(Example.create(userStatusObject));
crit.createCriteria("UserAuthorization").add(Example.create(userAuthorizationObject));

私の質問は、これを特定のUserオブジェクトだけで動的にプログラムする方法です。QBEを使用する以外の方法はありますか?

4

3 に答える 3

3

QBEと通常の式を組み合わせて、QBEがサポートしていない部分を処理できます。

Criteria crit = getSession().createCriteria(class);
    .add(Example.create(userObject));
    .add(Expression.eq("UserStatus", userObject.getUserStatus()));
于 2012-02-16T17:24:31.423 に答える
1

リフレクションを使用して、リポジトリベース内で機能することがわかった一般的な回答を次に示します。

protected T GetByExample(T example)
{
    var c = DetachedCriteria.For<T>().Add(Example.Create(example).ExcludeNone());
    var props = typeof (T).GetProperties()
        .Where(p => p.PropertyType.GetInterfaces().Contains(typeof(IEntityBase)));
    foreach (var pInfo in props)
    {
        c.Add(Restrictions.Eq(pInfo.Name, pInfo.GetValue(example)));
    }
    return Query(c);
}

すべてのエンティティが IEntityBase から継承されていることに注意してください。これにより、オブジェクト プロパティからこれらの外部キー参照だけを見つけて、基準に追加することができました。クエリを実行する何らかの方法を提供する必要があります (iecGetExecutableCriteria(Session))

于 2015-03-10T21:12:20.667 に答える
0

これは、すべてのエンティティが休止状態で例によってクエリを使用するために使用できるコードです。

  /**
                 * This method will use for query by example with association 
                 * @param exampleInstance the persistent class(T) object
                 * @param restrictPropertyName the string object contains the field name of the association
                 * @param restrictPropertyValue the association object 
                 * @return list the persistent class list
                 */
public List<T> queryByExampleWithRestriction(T exampleInstance, String restrictPropertyName, Object restrictPropertyValue) {
            log.info("Inside queryByExampleWithRestriction method of GenericHibernateDAO");
            List<T> list = null;
            try {
                Criteria criteria = getSession().createCriteria(exampleInstance.getClass());  
                Example example =  Example.create(exampleInstance);
                criteria.add(example);
                criteria.add(Restrictions.eq(restrictPropertyName, restrictPropertyValue));
                list = criteria.list();
                log.info("Executed the queryByExampleWithRestriction query with criteria successfully!");
            } catch(HibernateException e){
                throw (e);
            }
            finally{
                this.closeSession();
            }
            return list;  
        }
于 2016-12-10T05:18:40.200 に答える