java - 为什么 CTE 查询在 Hibernate 中不起作用?

标签 java sql-server hibernate java-7 spring-4

这是我的 CTE 查询

String query = "WITH Search(id, name, merchantId, merchantName,merchantNo, purpose, maxDate, paymentAmount) AS (SELECT PAS.GATEWAY_ID AS id, (SELECT NAME FROM GATEWAY_DETAILS WHERE GATEWAY_ID=(SELECT GATEWAY_ID FROM GATEWAY WHERE GATEWAY_ID=PAS.GATEWAY_ID)) AS NAME, PD.merchantName_ID, (SELECT merchantName_NAME FROM merchantName_MASTER WHERE merchantName_ID=PD.merchantName_ID) AS merchantName, PD.TXN_NO, (SELECT MERCHANT_DESC FROM MERCHANTS WHERE DESC_ID=PAS.DESC_ID) AS PURPOSE, PD.TXN_DATE AS maxDate,CHEQUE_AMOUNT FROM TXN_DETAILS PD INNER JOIN GATEWAY_PASS PAS ON PD.PMNT_TXN_ID=PAS.PMNT_TXN_ID WHERE  PD.TXN_DATE  BETWEEN '2016/10/28' AND '2016/12/28' AND PD.GATEWAY_ID=PAS.GATEWAY_ID), MaxDate1(id1, MAX_DATE) AS (SELECT PD.GATEWAY_ID, MAX(maxDate) AS MAX_DATE FROM TXN_DETAILS PD, Search SMD WHERE GATEWAY_ID IN(SELECT id FROM Search) GROUP BY PD.GATEWAY_ID), MaxDate2(id1, MAX_DATE) AS ( SELECT PD.GATEWAY_ID, MAX(PD.TXN_DATE) FROM TXN_DETAILS PD, Search SMD WHERE PD.GATEWAY_ID IN(SMD.id) GROUP BY PD.GATEWAY_ID ), TxnDetails(GATEWAY1,  txnDate1, GATEWAY2, txnDate2) AS (  SELECT MD1.id1,MD2.id1,MD1.MAX_DATE, MD2.MAX_DATE FROM MaxDate1 MD1  INNER JOIN  MaxDate2 MD2 ON MD1.id1=MD2.id1 WHERE MD1.MAX_DATE=MD2.MAX_DATE ) SELECT PD.GATEWAY_ID, (SELECT NAME FROM GATEWAY_DETAILS    WHERE GATEWAY_ID=(SELECT GATEWAY_ID FROM GATEWAY WHERE GATEWAY_ID=PD.GATEWAY_ID)) AS NAME,  (SELECT merchantName_NAME FROM merchantName_MASTER WHERE merchantName_ID=PD.merchantName_ID) AS merchantName_NAME,  PD.TXN_NO, PD.TXN_DATE, PD.CHEQUE_AMOUNT,   (SELECT DESC_ID FROM MERCHANTS WHERE DESC_ID IN (SELECT DESC_ID FROM GATEWAY_PASS WHERE PMNT_TXN_ID=PD.PMNT_TXN_ID)) AS DESC_ID ,    (SELECT MERCHANT_DESC FROM MERCHANTS WHERE DESC_ID IN (SELECT DESC_ID FROM GATEWAY_PASS WHERE PMNT_TXN_ID=PD.PMNT_TXN_ID)) AS PURPOSE , PD.TXN_DATE FROM TXN_DETAILS PD WHERE PD.GATEWAY_ID IN (SELECT GATEWAY1 FROM TxnDetails) AND PD.TXN_DATE IN (SELECT txnDate2 FROM TxnDetails)";

这是 DAO

  List<Object[]> ObjList = entityManager.createNativeQuery(query).getResultList();
            List<TxntxnDTO> txnDtoList = new ArrayList();

            for (Object[] object : ObjList) {
                TxnDTO txnDTO = new TxnDTO();
                txnDTO.setid((String) object[0]);
                txnDTO.setname((String) object[1]);
                txnDTO.setmerchantNameName((String) object[2]);
                txnDTO.setmerchantNo((String) object[3]);
                txnDTO.setTxnDate((Date) object[4]);
                txnDTO.setTxnAmount((BigDecimal) object[5]);
                txnDTO.setMerchantId((Integer) object[6]);
                txnDTO.setTxnDesc((String) object[7]);

                txnDtoList.add(txnDTO);
            }

查询在 SQL 中工作正常,但在 DAO 中出错

javax.persistence.PersistenceException:org.hibernate.MappingException:没有 JDBC 类型的方言映射:-9

最佳答案

我设法通过转换返回对象来解决这个问题:

SELECT CAST(field AS VARCHAR(20)) AS field

来自https://stackoverflow.com/a/12986024/2454665 ,似乎有时数据库会以奇怪的类型返回自定义 SQL 查询的结果,这些类型无法映射到 Hibernate 类型,因此需要进行 CAST。

关于java - 为什么 CTE 查询在 Hibernate 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42019030/

相关文章:

java - 在 java spring hibernate 3.6.3 中如何告诉方法等待直到获取锁以及如何重试失败的事务?

java - hibernate 实体 setter 中的额外操作

java - 如何在 postgresql 中使用 LO 数据类型?

sql-server - GUID:varchar(36) 与 uniqueidentifier

java - 无法使用 java 连接到 godaddy MySQL

sql - 存储过程: reduce code duplication using temp tables

java - 如何知道使用了哪个框架?

Java - 在除 double 时无法将 double 转换为整数

java - Eclipse 总是希望代码位于 com\folder 而不是 com.folder

java - Struts 2 当用户插入不存在的 Action 时该怎么办