我需要將JPA實體映射到返回表的Postgres函數。 所以每當我查詢這個實體時,它都會自動調用這個函數。可能嗎? 也許@NamedNativeQuery可以提供幫助嗎?是否有可能將JPA實體映射到存儲過程(函數)?
類似this也許?
我需要將JPA實體映射到返回表的Postgres函數。 所以每當我查詢這個實體時,它都會自動調用這個函數。可能嗎? 也許@NamedNativeQuery可以提供幫助嗎?是否有可能將JPA實體映射到存儲過程(函數)?
類似this也許?
您可以使用CallableStatement的
CON是你連接對象
CallableStatement cs = con.prepareCall("{call your_procedure()}");
,如果你有參數:
CallableStatement cs = con.prepareCall("{call your_procedure(?,?)}");
實例
cs.setString(1,your_param);
如果你想獲得的結果:
例
cs.registerOutParameter(2, Types.INTEGER);
這與問的問題並沒有太大關係,因爲它明白的sql和hibernate都沒有,jpa – XtremeBaumer
如果你的函數沒有任何參數,你可以將其封裝在一個觀點:
CREATE VIEW my_entity_procedure AS
SELECT 'Id:' || i AS some_field, i FROM generate_series(0, 100) i;
然後將其映射到只讀實體(@Immutable
)。
我同意,這很奇怪,我不推薦這種方法。請記住,您可以使用ResultTransformer
將對象列表(本例中爲DTO)中的ResultSet變換爲原始。像下面必須的東西的工作原理:
public List<MyFunctionDTO> getAllFromMyFunction() {
StringBuilder sql = new StringBuilder("SELECT i FROM generate_series(0, 100) i");
Query query = getHibernate().getSession().createSQLQuery(sql.toString());
query.setResultTransformer(Transformers.aliasToBean(MyFunctionDTO.class));
return query.list();
}
我已經想過了查看方法。但是我的功能需要接受參數。 –
我不知道的Postgres的侷限性,但對於的一般規則映射實體使用JPA的存儲過程是here:
@Entity
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(
name = "myNamedProcedure",
procedureName = "SP_NAME",
resultClasses = { MyEntity.class },
parameters = {
@StoredProcedureParameter(
name = "parameter1",
type = Integer.class,
mode = ParameterMode.IN) ... })
})
public class MyEntity {...}
在命名查詢您的對象只是一個快捷方式,它使您只需編寫一次查詢,並且每次使用時都可以不用再次寫入。 – Frank
實體映射到表或視圖。就這些。 FUNCTION的結果可以映射到DTO,就像任何查詢可以是 –
我認爲這足以將表名稱設置爲函數,但我不確定是否每次都會調用 – XtremeBaumer