2017-01-09 23 views
0

У меня есть объект value, для которого я хочу отобразить свой собственный набор результатов запросов. Я использую @SQLResultSetMapping для отображения полей объекта, но когда значение любого столбца null, исключение бросить:SQLResultSetMapping бросает исключение в случае нулевых столбцов

Exception [EclipseLink-6177] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.QueryException 
Exception Description: The column result [custom_properties] was not found in the results of the query. 

Мой Entity Класс и картографии

@Entity 
@Multitenant(MultitenantType.TABLE_PER_TENANT) 
@Table(name = "account_master") 
@SqlResultSetMapping(name = "DTO_MAPPING", classes = @ConstructorResult(
    targetClass = AccountDTO.class, 
    columns = {@ColumnResult(name = "id"), 
     @ColumnResult(name = "name"), 
     @ColumnResult(name = "custom_properties") 
    }) 
) 
public class Account implements Serializable { 
// fields, setters and getters 

} 

Значение объекта:

public class AccountDTO { 

    public AssetDTO(){ 
    } 

    public AssetDTO(int id, String name, String customProperties) { 
    this.id = id; 
    this.name = name; 
    this.customProperties = customProperties; 
    } 

} 

И заявление об исполнении

List<AccountDTO> accList = entityManager.createNativeQuery("SELECT id, name, custom_properties FROM account_master WHERE acc_hierarchy <@ 2.3", "DTO_MAPPING").getResultList() 

Если custom_properties (который является нулевым) заменяется статическим значением в запросе, отображение работает отлично. Что-то не так с реализацией? Поскольку отображение нулевого значения похоже на общий сценарий.

ответ

1

Это был представлен как ошибка в EclipseLink: https://bugs.eclipse.org/bugs/show_bug.cgi?id=484276

В качестве обходного пути, вы можете указать тип в

@ColumnResult

аннотаций.

Таким образом, вы должны изменить свой код:

@Entity 
@Multitenant(MultitenantType.TABLE_PER_TENANT) 
@Table(name = "account_master") 
@SqlResultSetMapping(name = "DTO_MAPPING", classes = @ConstructorResult(
    targetClass = AccountDTO.class, 
    columns = {@ColumnResult(name = "id"), 
     @ColumnResult(name = "name"), 
     @ColumnResult(name = "custom_properties", type=String.class) 
    }) 
) 
public class Account implements Serializable { 
// fields, setters and getters 

} 
+0

Он работал! Теперь, когда я думаю об этом, информация типа класса аргументов конструктора будет необходима для получения соответствующей конструкции путем отражения. Нулевые столбцы должны указывать на это явно для работы jpa. В конце концов, это может быть не ошибка. – grizzly