JPA Hibernate - объект с @Loader и функциональным полем в select не будет работать должным образом - PullRequest
0 голосов
/ 09 октября 2019
@Entity
@Table(name="cad_paciente")
@Loader(namedQuery = "selectInicial")
@NamedNativeQuery(
        name="selectInicial", 
        query="select p.*, fu_obter_lista_convenios_pac(p.id) as ds_convenio from cad_paciente p where p.id = ?", resultClass = Paciente.class,
        resultSetMapping = "sqlResult")
@SqlResultSetMapping(
          name="sqlResult",
          entities={
            @EntityResult(entityClass = Paciente.class, fields={
                @FieldResult(name="ds_convenio",column="ds_convenio")})})
public class Paciente {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
@Column(name="id_empresa")
private Integer id_empresa;    

...

@Transient
@Column(name="ds_convenio")
private String ds_convenio;

public String getDs_convenio() {
    return ds_convenio;
}

public void setDs_convenio(String ds_convenio) {
    this.ds_convenio = ds_convenio;
}

Мой метод контроллера "pacientes.findAll ()" не будет возвращать поле "ds_convenio" с правильным значением, перечисляя "null" всегда в моем возвращении JSON.

Что мне нужноделать?

1 Ответ

0 голосов
/ 09 октября 2019

Попробуйте удалить аннотацию @Transient и предоставьте столбец, как показано ниже:

@Column(name="ds_convenio")
private String ds_convenio;

@org.springframework.data.annotation.Transient специально указывает платформе пружины, что используемая вами Object Mapper не должна включать это значение при преобразовании изОбъект Java в JSON. Кроме того, это означает, что значение не должно сохраняться в базе данных, что означает, что вы не можете запросить его.

Или, если вы хотите сохранить , это само по себе как переходное, но не требует значения для сериализации, затем зарегистрируйте объектный преобразователь, как показано ниже:

@Bean
public ObjectMapper includeTransientObjectMapper() {
    Hibernate5Module hibernate5Module = new Hibernate5Module();
    hibernate5Module.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(hibernate5Module);
    return mapper;
}

Или в вашем случае, так как вам нужен результат @NamedNativeQuer, в котором вы использовали псевдоним ds_convenioиспользование @FieldResult может потребоваться для получения желаемого результата следующим образом:

@Entity
@Table(name="cad_paciente")
@Loader(namedQuery = "selectInicial")
@NamedNativeQuery(name="selectInicial", query="select p.*, fu_obter_lista_convenios_pac(p.id) as ds_convenio from cad_paciente p where p.id = ?", resultClass = Paciente.class)
@SqlResultSetMapping(name="Results",
       entities={
           @EntityResult(entityClass=com.acme.Order.class, fields={
               @FieldResult(name="id", column="id"),
               @FieldResult(name="id_empresa", column="id_empresa"),
               ........
       })
public class Paciente {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
@Column(name="id_empresa")
private Integer id_empresa;    

...

@Transient
@Column(name="ds_convenio")
private String ds_convenio;

Чтение doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...