Мультиселект в критериях jpa вызывает недопустимое исключение аргумента, когда столбец внешнего ключа равен нулю - PullRequest
0 голосов
/ 16 мая 2019
Join<Location, LocationType> locationTypeJoin = root.join(Location_.LOCATION_TYPE);
        Join<Location, Address> addressJoin = root.join(Location_.ADDRESS, JoinType.LEFT);
        Join<Address, State> stateJoin = addressJoin.join(Address_.STATE, JoinType.LEFT);
        Join<Address, County> countyJoin = addressJoin.join(Address_.COUNTY, JoinType.LEFT);

criteriaQuery.multiselect(
            root.get(Location_.LOCATION_ID), root.get(Location_.LOCATION_NAME), root.get(Location_.LOCATION_CODE),
            root.get(Location_.LAST_UPDATE_DATE_TIME), root.get(Location_.CREATE_DATE_TIME), root.get(Location_.SOURCE_SYSTEM_UNIQUE_KEY),
            joinLocationType.get(LocationType_.LOCATION_TYPE_ID), joinLocationType.get(LocationType_.LOCATION_TYPE),
            joinLocationType.get(LocationType_.LOCATION_TYPE_DESC),joinAddress.get(Address_.ADDRESS_ID));

Используя оператор joinAddress.get(Address_.ADDRESS_ID) выше в множественном выборе, я пытаюсь выбрать внешний ключ таблицы Address в таблице Location.Поскольку я делаю левое соединение, для некоторого ряда это становится нулевым.Поэтому, когда я пытаюсь выбрать, он показывает исключение недопустимого аргумента.

1 Ответ

0 голосов
/ 17 мая 2019

Я решил эту проблему, добавив наблюдения, чтобы проверить, является ли столбец пустым или нет.

Expression<Object> case1 = criteriaBuilder.selectCase().when(criteriaBuilder.isNotNull(joinAddress.get(Address_.ADDRESS_ID)), joinAddress.get(Address_.ADDRESS_ID)).otherwise(0);
criteriaQuery.multiselect(
        root.get(Location_.LOCATION_ID), root.get(Location_.LOCATION_NAME), root.get(Location_.LOCATION_CODE),
        root.get(Location_.LAST_UPDATE_DATE_TIME), root.get(Location_.CREATE_DATE_TIME), root.get(Location_.SOURCE_SYSTEM_UNIQUE_KEY),
        joinLocationType.get(LocationType_.LOCATION_TYPE_ID), joinLocationType.get(LocationType_.LOCATION_TYPE),
        joinLocationType.get(LocationType_.LOCATION_TYPE_DESC),case1);
...