как сопоставить набор результатов, не являющийся сущностью, полученный из NameStoredProcedure в JPA 2.1?

Я вызываю процедуру postgresql, используя jpa 2.1, и хотел бы преобразовать набор результатов в класс, не являющийся сущностью, с именем StoreAndCategoryID, содержащий два целочисленных поля с именами: storeid, categoryid. Эти два поля возвращаются из процедуры.

@NamedStoredProcedureQuery(
    name = "Category.func_getcategorybytextsearchid",
    procedureName = "func_getcategorybytextsearchid",    
    parameters = {@StoredProcedureParameter(name = "textsearchid", type = Integer.class,
                                            mode = javax.persistence.ParameterMode.IN ),
          @StoredProcedureParameter(name = "mycursor", type = void.class, 
                                    mode = ParameterMode.REF_CURSOR )}
)

приведенный ниже код представляет собой процедуру, выполняемую в Postgresql.

CREATE OR REPLACE FUNCTION func_getcategorybytextsearchid(textsearchid integer )
  RETURNS refcursor  AS
$BODY$
declare mycursor refcursor ;
BEGIN
mycursor   = 'mycursor';

OPEN mycursor FOR (
            select storeid, categoryid 
            from item_full_text_search
            where itemfulltextsearchid = $1;

RETURN mycursor ;
end;

приведенный ниже код Java показывает, как я вызываю процедуру

StoredProcedureQuery q = 
em.createNamedStoredProcedureQuery("Category.func_getcategorybytextsearchid");
q.setParameter("textsearchid", textsearchid);

if (q.execute())
{
   //the result set needs to convert to StoreAndCategoryID class if possible.
   StoreAndCategoryID storeAndCategoryID  =  q.getOutputParameterValue("mycursor");  
}

public class StoreAndCategoryID
{
        int storeid;
        int categoryid;
}

как я могу изменить @NamedStoredProcedureQuery, чтобы вернуть/преобразовать класс StoreAndCategoryID, не являющийся сущностью?

Спасибо,


person fs2050    schedule 19.09.2014    source источник


Ответы (2)


Вы не можете сопоставить набор результатов хранимой процедуры с классом, не являющимся сущностью, используя StoredProcedureQuery. Но, если вы будете использовать (если вы можете использовать запрос JPQL вместо вызова хранимой процедуры) TypedQuey, вы можете использовать выражение конструктора JPQL или @SqlResultSetMapping в NativeQuery

person Javasick    schedule 21.12.2015

Вы можете сделать это, используя @SqlResultSetMapping и @ConstructorResult.

@SqlResultSetMapping(name = "CalendarsMapping", classes = {
    @ConstructorResult(targetClass = Calendar.class, columns = { @ColumnResult(name = "OutDate"),
            @ColumnResult(name = "CategoryID", type = Long.class), @ColumnResult(name = "CategoryName"),
            @ColumnResult(name = "DepositDate"), @ColumnResult(name = "EventDate"),
            @ColumnResult(name = "EventType"), @ColumnResult(name = "Status"),
            @ColumnResult(name = "Effective", type = String.class),
            @ColumnResult(name = "Indicator", type = String.class), @ColumnResult(name = "TermDate"),
            @ColumnResult(name = "TID"), @ColumnResult(name = "TName"), @ColumnResult(name = "Series"),
            @ColumnResult(name = "Symbol"), @ColumnResult(name = "TType", type = String.class) }) })



StoredProcedureQuery procedureQuery = entityManager.createStoredProcedureQuery(
            "GetDepAndTerm", "CalendarsMapping");
procedureQuery.getResultList();
person fjkjava    schedule 07.09.2016
comment
Я следовал этому, но все же исключению во время выполнения, Unknown Entity. Какие-нибудь мысли? - person Gowthami Reddy; 06.06.2018
comment
Привет @GowthamiReddy, ты нашел решение? - person Remy; 04.12.2020