0

ScInfo多くの異なるクラスに存在するクラスがあります。このクラスには、 というメンバー変数ScDetailsを持つリストもあります。DatenextExecution

ScDetailsオブジェクトのnextExecutionメンバー変数が現在のサーバーの時間以降 (つまり、persistenceManagerInstance.getServerDate() )である適格なオブジェクトを継続的に検索する必要があります。>= serverDateのオブジェクトをScInfo持つオブジェクトを検索する必要があることを意味します)ScDetailsnextExecution

だから私は次の方法を使用します(一部が示されています):

public List<Object[]> getEligbleForExecution(long amount) {
    PersistenceManager pm = null;
    Transaction t = null;
    try {
        pm = getPM();
        t = pm.currentTransaction();
        t.begin();
        Query q = pm
                .newQuery(
                        entityClass, //This is generic
                        "!this.deleted && this.scheduleActive && det.active == true && (det.nextExecution == null || det.nextExecution <= :serverDate) && det.running == false && this.scInfo.scDetails.contains(det)");
        q.declareVariables(ScDetail.class.getName() + " det;");
        q.setRange(0, amount);
        q.setResult("this, det");
        q.setOrdering("det.nextExecution"); // This is the statement I need to apply but it's causing the error below
        Date serverDate = pm.getServerDate();
        List<Object[]> raw = new ArrayList<Object[]>((List<Object[]>) q.execute(serverDate));

これにより、次のエラー スタック トレースがスローされます ( DEBUGレベル、この問題を解決するために不可欠であると私が考えたことを述べました)。

14:54:32 DEBUG (Log4JLogger.java:58)-[main] >> QueryToSQL.processVariable (unbound) variable=det is not yet bound so returning UnboundExpression
14:54:32 DEBUG (Log4JLogger.java:58)-[main] Updating mapping of org.datanucleus.store.rdbms.sql.expression.NullLiteral@727f3b8a to be org.datanucleus.store.mapped.mapping.DateMapping@e72a8082
14:54:32 DEBUG (Log4JLogger.java:58)-[main] Transaction rolling back for ObjectManager org.datanucleus.MultithreadedObjectManager@fba0f36
14:54:32 DEBUG (Log4JLogger.java:58)-[main] Rolling back [DataNucleus Transaction, ID=Xid={A strange uncopyable character is in here !}, enlisted resources=[]]
14:54:32 DEBUG (Log4JLogger.java:58)-[main] Transaction rolled back in 1 ms
14:54:32 ERROR (ScTasksDAOImpl.java:67)-[main] Looking up eligible SC tasks
java.lang.NullPointerException
    at org.datanucleus.store.rdbms.query.QueryToSQLMapper.processVariableExpression(QueryToSQLMapper.java:3245)
    at org.datanucleus.store.rdbms.query.QueryToSQLMapper.processPrimaryExpression(QueryToSQLMapper.java:2075)
    at org.datanucleus.query.evaluator.AbstractExpressionEvaluator.compilePrimaryExpression(AbstractExpressionEvaluator.java:180)
    at org.datanucleus.query.evaluator.AbstractExpressionEvaluator.compileUnaryExpression(AbstractExpressionEvaluator.java:169)
    at org.datanucleus.query.evaluator.AbstractExpressionEvaluator.compileAdditiveMultiplicativeExpression(AbstractExpressionEvaluator.java:148)
    at org.datanucleus.query.evaluator.AbstractExpressionEvaluator.compileRelationalExpression(AbstractExpressionEvaluator.java:123)
    at org.datanucleus.query.evaluator.AbstractExpressionEvaluator.compileOrAndExpression(AbstractExpressionEvaluator.java:65)
    at org.datanucleus.query.evaluator.AbstractExpressionEvaluator.evaluate(AbstractExpressionEvaluator.java:46)
    at org.datanucleus.query.expression.Expression.evaluate(Expression.java:337)
    at org.datanucleus.store.rdbms.query.QueryToSQLMapper.compileOrdering(QueryToSQLMapper.java:845)
    at org.datanucleus.store.rdbms.query.QueryToSQLMapper.compile(QueryToSQLMapper.java:403)
    at org.datanucleus.store.rdbms.query.JDOQLQuery.compileQueryFull(JDOQLQuery.java:883)
    at org.datanucleus.store.rdbms.query.JDOQLQuery.compileInternal(JDOQLQuery.java:343)
    at org.datanucleus.store.query.Query.executeQuery(Query.java:1747)
    at org.datanucleus.store.query.Query.executeWithArray(Query.java:1666)
    at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:243)
    at com.sc.ipk.sc.services.ScTasksDAOImpl.getEligbleForExecution(ScTasksDAOImpl.java:41)
    at com.sc.ipk.ixl.services.IxlTestDAOImpl.main(IxlTestDAOImpl.java:977)
14:54:32 DEBUG (Log4JLogger.java:58)-[main] Object Manager "org.datanucleus.MultithreadedObjectManager@fba0f36" closed

では、宣言された変数を使用して順序付けを照会することはできませんか? サブクエリを使用してみましたが、それも機能しませんでした。宣言された変数を使用して注文できない場合は、新しい質問を開始できる可能性があります。

編集: ニールは寛大にも、コレクションに存在するべき要素に基づいて順序付けすることは、彼にとって合理的ではないと提案しました。私はそれを理解していますが、たとえば、ScDetailsオブジェクトを注文した後に最初にオブジェクトを検索してから、後でメインオブジェクトを検索することはできません。これは、ターゲットのメインオブジェクトが時々異なり、ScDetails属していないオブジェクトを検索する場合があるためメイン候補クラスに。

例: ABCScInfoのコレクションを持っています(上記と同じ)ScDetails

したがって、ScDetails最初にオブジェクトを検索すると (すべてを注文した後)、主な候補クラス ( AB & C ) をフィルター処理できません。これは、 BまたはCの候補を取得しようとしているときに、 AScDetailsに属するa を使用する可能性があるためです。

ありがとうございました。

4

1 に答える 1

1

その変数で注文する方法がわかりません。候補のコレクションの要素を表します。したがって、候補が 5 つの要素を持っている場合、要素のいくつかのプロパティ (1-N マッピング) によってどのように順序付けできるかは不確定です。明らかに、候補が要素である場合、変数であるかどうかにかかわらず、要素のプロパティによる順序付けは完全に理にかなっています。

于 2013-04-17T13:18:51.763 に答える