如何从请求的where子句中删除鉴别符?

时间:2018-11-15 12:00:19

标签: java orm jdo datanucleus jdoql

我有一个这样声明的父类:

@PersistenceCapable(table = "S_ROT_CLASS")
@Inheritance(strategy = InheritanceStrategy.NEW_TABLE)
@Discriminator(strategy = DiscriminatorStrategy.VALUE_MAP, column = "CLASS_ID", value = "300")
@FetchGroup(name = Constants.LAZY_LOAD_GROUP_FETCH_PLAN, members = { @Persistent(name = "classId"),
        @Persistent(name = "objId") })
public class DBObject {

    @Persistent(dependent = "false")
    @Column(name = "S_ROT_CREATE_USR_ID")
    private DBUser createdBy;

    @Persistent(dependent = "false")
    @Column(name = "S_ROT_USR_ID")
    private DBUser lastUpdateBy;

    @Column(name = "CLASS_ID")
    @Extension(vendorName = "datanucleus", key = "insertable", value = "false")
    @Extension(vendorName = "datanucleus", key = "updateable", value = "false")
    private long classId;

    @PrimaryKey
    @Column(name = "OBJ_ID")
    private long objId;

   public DBObject() {
        super();
        setClassId(300);
    }

    //with getters and setters
}

和一些类似的继承类:

@PersistenceCapable(table="S_PMG_CLASS")
@Inheritance(strategy=InheritanceStrategy.NEW_TABLE)
@Discriminator(value="330")
public class DBUserGroup extends DBObject{

    @Column(name="CLASS_ID")
    private long classId330;

    @Column(name="OBJ_TYPE")
    private long objType330;
 public DBUserGroup(){
        super();
        setClassId(330);
    }

//with getters and setters
}

无缘无故,Datanucleus在这样生成的sql请求的where子句中使用discrimnator:

SELECT A0.CLASS_ID, A0.OBJ_ID, A0.CLASS_ID
  FROM S_ROT_CLASS A0
 WHERE ( (   A0.CLASS_ID = '300'
          OR A0.CLASS_ID = '1230985'
          OR A0.CLASS_ID = '44267844'
          OR A0.CLASS_ID = '44267843'
          OR A0.CLASS_ID = '1230798'
          OR A0.CLASS_ID = '6744896'
          OR A0.CLASS_ID = '44267842'
          OR A0.CLASS_ID = '1230719'
          OR A0.CLASS_ID = '39132351'
          OR A0.CLASS_ID = '150031398'
          OR A0.CLASS_ID = '65607622'
          OR A0.CLASS_ID = '1230818'
          OR A0.CLASS_ID = '1230795'
          OR A0.CLASS_ID = '1230744'
          OR A0.CLASS_ID = '104595125'
          OR A0.CLASS_ID = '18699812'
          OR A0.CLASS_ID = '44303147'
          OR A0.CLASS_ID = '44303146'))
       AND A0.S_ROT_CREATE_USR_ID = 125874

我该如何告诉Datanucleus在其请求中不使用区分符(classId)?

1 个答案:

答案 0 :(得分:0)

有一个很好的理由说明为什么默认情况下向这些查询中添加一个鉴别器...因为您在该类(和子类/超类)上定义了一个鉴别器,并且还因为您的查询可能未在该继承中包括所有类树。同样,如果将某些数据持久存储到这些表中并使用不同的鉴别符值将该数据与JDO层使用的数据隔离开来怎么办?

肯定是在5.2版I see a query extension dont-restrict-discriminator )中的文档中,该文档可用于覆盖默认值。不知道这是否在早期版本中。