0

我有一个ScInfo存在于许多不同类中的类。这个类还有一个列表,ScDetails其中有一个Date名为 的成员变量nextExecution

我需要不断查找符合条件的对象,其ScDetails对象的nextExecution成员变量在或等于当前服务器的时间之后(即persistenceManagerInstance.getServerDate())。这意味着我需要查找对象,ScInfo具有>= serverDate的ScDetails对象)nextExecution

所以我使用以下方法(显示了一部分):

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

这会引发以下错误堆栈跟踪(调试级别,我提到了我认为对于解决此问题至关重要的内容):

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不属于的对象到主要候选人类。

例如: A hasScInfo它有一个集合ScDetails BC(同上)

因此,如果我首先查找ScDetails对象(在对所有对象进行排序之后),我将无法过滤我的主要候选类(ABC),因为我可能会在尝试获取BC候选对象时使用ScDetails属于A 的对象。

谢谢你。

4

1 回答 1

1

我看不出您如何按变量排序。它表示候选集合中的一个元素。因此,如果候选人有 5 个元素,那么它如何通过元素上的某些属性进行排序是不确定的(1-N 映射)。显然,如果候选者是元素,那么根据元素的某些属性进行排序是非常有意义的,无论是否可变。

于 2013-04-17T13:18:51.763 回答