При вызове хранимой процедуры с использованием JPA, как получить пользовательские поля, которых нет в классе Entity - PullRequest
0 голосов
/ 26 февраля 2020

Я использую весеннюю загрузку вместе с JPA. Мне нужно вызвать хранимую процедуру из Ms Sql, используя класс сущностей с помощью запроса именованных хранимых процедур. Хранимая процедура вернет некоторые дополнительные поля, которых нет в классе сущности. в таком случае как мне получить доступ к этим полям?

И в другом сценарии SP не будет возвращать некоторые поля, которые обозначены как «not-null = true» в конфигурации объекта. В этом случае запрос именованных хранимых процедур выдаст исключение, сообщив, что имя столбца «nameA» недопустимо. Есть ли возможность решить эти 2 проблемы.

Класс сущности

@Entity
@Table(name = "tbl_ClassA")
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "getData",
                procedureName = "sp_getHistory",
                resultClasses = ClassA.class
        )
})

public class ClassA implements Serializable {

    private static final long serialVersionUID = 1L;

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

    @Column(name = "search_type", nullable = false)
    private String searchType;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

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

}

Репозиторий

@Repository("classARepository")
public interface ClassARepository extends JpaRepository<ClassA, Long>,CustomRepository {

}

Пользовательский интерфейс репозитория

public interface CustomRepository {

    List<ClassA> getHistory();
}

Пользовательский Реализация класса репозитория

@Scope("prototype")
public class CustomRepositoryImpl implements  CustomRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public List<ClassA> getHistory() {
      List<ClassA> listA = null;
      StoredProcedureQuery query =                  
         entityManager.createNamedStoredProcedureQuery("getData");
      listA = query.getResultList();
      return listA;
    }
}

Хранимая процедура

USE [DB_A]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[sp_getHistory]
    AS
BEGIN
    SELECT id, first_name, last_name, age, CONCAT(first_name, ' ', last_name) as full_name from 
    tbl_ClassA
END

Видно, что в результате SP исключается search_type и добавляется полное_имя.

...