使用声明的变量的属性进行排序

时间:2013-04-16 13:06:36

标签: jdo datanucleus jdoql

我有一个ScInfo类,存在于许多不同的类中。此类还有一个ScDetails列表,其中包含一个名为Date的{​​{1}}成员变量。

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

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

nextExecution

这引发了以下错误堆栈跟踪( DEBUG 级别,我提到了我认为解决此问题的必要条件):

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

所以不可能使用声明的变量来查询排序吗?我尝试使用子查询,但我也无法使用它,也许我可以为此开始一个新的问题,如果不能使用声明的变量进行排序。

修改 Neil慷慨地建议,基于一个应该存在于集合中的元素的排序对他来说看起来并不合理。我理解这一点但是我不能例如在命令它们之后首先查找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 个对象,然后查找我的主要对象,因为我的目标主对象可能会不时发生变化我可能会查找{ {1}}不属于主要候选类的对象。

例如: A ScDetails集合为ScDetails B C (与上述相同)

因此,如果我首先查找ScInfo个对象(在订购全部之后),我无法过滤我的主要候选类别( A B &amp; C )因为我在尝试获取 B C 候选人。

谢谢。

1 个答案:

答案 0 :(得分:1)

我不知道如何通过那个变量订购。它代表候选人集合的一个元素。因此,如果候选人说出了5个元素,那么它是如何通过元素上的某个属性(1-N映射)进行排序是不确定的。显然,如果候选者是元素,那么按元素的某些属性排序是完全合理的,无论是否可变。