Как убрать дискриминаторы откуда-то в запросе? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть родительский класс, объявленный так:

@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 использует дискриминатор в предложении whereиз SQL-запросов, которые он генерирует, как этот:

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 голосов
/ 15 ноября 2018

Существует очень веская причина, почему дискриминатор по умолчанию добавляется к таким запросам ... потому что вы определили дискриминатор для этого класса (и подклассов / суперклассов), а также потому, что ваш запрос может не включать все классы в это наследованиедерево.Точно так же, что если вы сохраняете некоторые данные в этих таблицах и используете различные значения дискриминатора, чтобы изолировать эти данные от того, что использует ваш уровень JDO?

Конечно, в документах для версии 5.2 я вижу расширение запроса ( dont-restrict -criminator ), которое можно использовать для отмены значения по умолчанию.Не знаю, есть ли это в более ранних версиях.

...