[英]JPA calling function in a native query is sending multiple parameters instead a UUID Collection
我創建了一個 PostgreSQL function 從 UUID 數組中獲取一些數據。
IE:
create function journey_statistics(journey_ids uuid[])
returns TABLE(project_id uuid, project_name character varying,...)
language plpgsql
如果我運行下一個 sql 語句,它將返回預期的數據:
select * from journey_statistics(array['0f36c7a5-04eb-4329-8e93-a13625a4ffa6'::uuid, 'bc10ee72-7b7f-4bbd-a70a-75477b484d58'::uuid])
但是,當我在 Java 上實現它並運行它時。 我收到下一個錯誤:
o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: function journey_statistics(uuid, uuid) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
這是我用來調用它的本機查詢。 而且我在其他類似的功能中也使用過相同的功能,沒有錯誤。 所以我無法理解問題是什么或我做錯了什么。
@Query(value = "select cast(project_id as varchar(36)) as projectId, project_name as projectName, cast(project_leader as varchar(36)) as projectLeader" +
" from journey_statistics(:uuids)", nativeQuery = true)
Collection<JourneyStatisticsView> getJourneyStatisticsById(Collection<UUID> uuids);
我試圖將數據轉換為數組,但看起來它正在轉換為記錄 [] 數組。 但更奇怪的是,如果我傳遞一個字符串集合然后我嘗試將它們轉換為我得到
function Journey_statistics(字符變化,字符變化)不存在
任何幫助表示贊賞,謝謝。
我找到了將 Collection 傳遞到 function 的解決方法。
它沒有我想要的那么復雜。 但至少它有效。
基本上,我創建了一個新的存儲庫來使用實體管理器並創建我自己的 sql 語句。
@Repository
public class JourneyStatisticsCustomRepositoryImpl implements JourneyStatisticCustomRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public List getJourneyStatisticsByIds(Collection<UUID> uuids) {
final Collection<String> formattedUUID = uuids.stream().map(uuid -> "cast('" + uuid + "' as uuid)").collect(Collectors.toSet());
final String joinedUUIDs = Strings.join(formattedUUID.iterator(), ',');
return entityManager.createNativeQuery("select cast(project_id as varchar(36)) as projectId, ..." +
"... from journey_statistics(array[" + joinedUUIDs +"])", JourneyStatisticsView.class).getResultList();
}
這會將正確的集合發送到 function 並按預期返回數據。
希望這可以幫助其他有類似問題的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.