我使用jpa 2.1调用postgresql过程,并希望将结果集转换为名为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上执行的proc
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?
谢谢,
答案 0 :(得分:0)
你可以使用@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();