需求是想多张表连表查询数据,试了两种情况,都报错,帮忙看看是哪里有问题:
第一种:
这中sql拼接提示实体某一个字段标识符无效,但是提示的字段是存在的。
第二种:
这种拼接sql,执行的时候提示表或视图不存在,但是直接复制图片中sql到数据库执行是正常查到数据的。帮忙看看是哪里出了问题
Jmix1.5的版本
第一种方式的具体报错信息发一下?
第二种方式我看你用了 ecom2g
,这个是跨库了?
第一种方式报错信息:
Call: SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (SELECT t2.FD_ID AS a1, t2.FD_ACCOMPANY_PRICE AS a2, t2.FD_BATCH_NUMBER AS a3, t2.FD_BORDER AS a4, t2.FD_CALCULATE_PRICE_DIMENSION AS a5, t2.FD_CHANNEL_PRICE AS a6, t2.FD_CHILD_CHARGE_TYPE AS a7, t2.FD_CHILD_PRICE AS a8, t2.FD_CREATE_TIME AS a9, t2.FD_CREATOR AS a10, t2.FD_DIMENSION AS a11, t2.FD_END_FLOAT AS a12, t2.FD_INCLUDE_TAX AS a13, t2.FD_INTERNATIONAL_NETWORK_PRICE_JSON AS a14, t2.FD_IS_BOSS2 AS a15, t2.FD_IS_DELETE AS a16, t2.FD_IS_INCLUDE_SERVICE_PRICE AS a17, t2.FD_IS_PACK_QUANTITY_NETWORK AS a18, t2.FD_LOUNGE_TYPE AS a19, t2.FD_NETWORK_CODE AS a20, t2.FD_NETWORK_PRICE AS a21, t2.FD_NIGHT_PRICE AS a22, t2.FD_OVER_HOUR_PRICE AS a23, t2.FD_PACK_QUANTITY_OUT_PRICE AS a24, t2.FD_PARAM_CONFIG AS a25, t2.FD_PARAM_CONFIG_TEMPLATE AS a26, t2.FD_PRICE_CONFIG AS a27, t2.FD_PRICE_PARAM_JSON AS a28, t2.FD_PRICE_TYPE AS a29, t2.FD_PRICING_TYPE AS a30, t2.FD_PRIVATE_ROOM_PRICE AS a31, t2.FD_PRODUCT_TYPE AS a32, t2.FD_PURCHASE_CODE AS a33, t2.FD_PURCOSTPRICEMODE AS a34, t2.FD_RULE_CODE AS a35, t2.FD_SECURITY_CHECK AS a36, t2.FD_SERVICE_LEVEL AS a37, t2.FD_SITE_CODE AS a38, t2.FD_STANDARD_TAX_RATE AS a39, t2.FD_START_FLOAT AS a40, t2.FD_START_TYPE AS a41, t2.FD_SUB_SERVER_CODE AS a42, t2.FD_SUB_SERVER_SINGLE_ID AS a43, t2.FD_TAX_RATE AS a44, t2.FD_UPDATE_TIME AS a45, t2.FD_UPDATOR AS a46, t2.FD_VAILIDITY_DATE AS a47, t2.FD_VALIDITY AS a48, t2.FD_INVAILIDITY_DATE AS a49, t2.FD_SUPPLIER_ID AS a50 FROM SUP_SINGLE_PRICE_CONFIG t2 LEFT OUTER JOIN SUP_RESOURCE_PURCHASE t0 ON (t2.FD_PURCHASE_CODE = t0.FD_PURCHASE_CODE) LEFT OUTER JOIN TD_PURCHASE_AGREEMENT t1 ON (t3.FD_ID = t1.FD_ID), TD_PURCHASE_AGREEMENT t3 WHERE (((t2.FD_IS_DELETE = ?) AND (t2.FD_PRODUCT_TYPE = ?)) AND (t3.FD_ID = t0.FD_AGREEMENT_ID))) a WHERE ROWNUM <= ?) WHERE rnum > ?
第二种没有跨库,都是在ECOM2G下的表。第二种方式报错信息:
Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select e.* from ecom2g.SUP_SINGLE_PRICE_CONFIG e LEFT JOIN ecom2g.SUP_RESOURCE_PURCHASE a on e.FD_PURCHASE_CODE = a.FD_PURCHASE_CODE LEFT JOIN ecom2g.TD_PURCHASE_AGREEMENT b on a.FD_AGREEMENT_ID = b.FD_ID WHERE e.FD_PRODUCT_TYPE = ‘N’ and e.FD_IS_DELETE = 0]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在
第一种方式报错信息:
Call: SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (SELECT t2.FD_ID AS a1, t2.FD_ACCOMPANY_PRICE AS a2, t2.FD_BATCH_NUMBER AS a3, t2.FD_BORDER AS a4, t2.FD_CALCULATE_PRICE_DIMENSION AS a5, t2.FD_CHANNEL_PRICE AS a6, t2.FD_CHILD_CHARGE_TYPE AS a7, t2.FD_CHILD_PRICE AS a8, t2.FD_CREATE_TIME AS a9, t2.FD_CREATOR AS a10, t2.FD_DIMENSION AS a11, t2.FD_END_FLOAT AS a12, t2.FD_INCLUDE_TAX AS a13, t2.FD_INTERNATIONAL_NETWORK_PRICE_JSON AS a14, t2.FD_IS_BOSS2 AS a15, t2.FD_IS_DELETE AS a16, t2.FD_IS_INCLUDE_SERVICE_PRICE AS a17, t2.FD_IS_PACK_QUANTITY_NETWORK AS a18, t2.FD_LOUNGE_TYPE AS a19, t2.FD_NETWORK_CODE AS a20, t2.FD_NETWORK_PRICE AS a21, t2.FD_NIGHT_PRICE AS a22, t2.FD_OVER_HOUR_PRICE AS a23, t2.FD_PACK_QUANTITY_OUT_PRICE AS a24, t2.FD_PARAM_CONFIG AS a25, t2.FD_PARAM_CONFIG_TEMPLATE AS a26, t2.FD_PRICE_CONFIG AS a27, t2.FD_PRICE_PARAM_JSON AS a28, t2.FD_PRICE_TYPE AS a29, t2.FD_PRICING_TYPE AS a30, t2.FD_PRIVATE_ROOM_PRICE AS a31, t2.FD_PRODUCT_TYPE AS a32, t2.FD_PURCHASE_CODE AS a33, t2.FD_PURCOSTPRICEMODE AS a34, t2.FD_RULE_CODE AS a35, t2.FD_SECURITY_CHECK AS a36, t2.FD_SERVICE_LEVEL AS a37, t2.FD_SITE_CODE AS a38, t2.FD_STANDARD_TAX_RATE AS a39, t2.FD_START_FLOAT AS a40, t2.FD_START_TYPE AS a41, t2.FD_SUB_SERVER_CODE AS a42, t2.FD_SUB_SERVER_SINGLE_ID AS a43, t2.FD_TAX_RATE AS a44, t2.FD_UPDATE_TIME AS a45, t2.FD_UPDATOR AS a46, t2.FD_VAILIDITY_DATE AS a47, t2.FD_VALIDITY AS a48, t2.FD_INVAILIDITY_DATE AS a49, t2.FD_SUPPLIER_ID AS a50 FROM SUP_SINGLE_PRICE_CONFIG t2 LEFT OUTER JOIN SUP_RESOURCE_PURCHASE t0 ON (t2.FD_PURCHASE_CODE = t0.FD_PURCHASE_CODE) LEFT OUTER JOIN TD_PURCHASE_AGREEMENT t1 ON (t3.FD_ID = t1.FD_ID), TD_PURCHASE_AGREEMENT t3 WHERE (((t2.FD_IS_DELETE = ?) AND (t2.FD_PRODUCT_TYPE = ?)) AND (t3.FD_ID = t0.FD_AGREEMENT_ID))) a WHERE ROWNUM <= ?) WHERE rnum > ?
第二种没有跨库,都是在ECOM2G下的表。第二种方式报错信息:
Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select e.* from ecom2g.SUP_SINGLE_PRICE_CONFIG e LEFT JOIN ecom2g.SUP_RESOURCE_PURCHASE a on e.FD_PURCHASE_CODE = a.FD_PURCHASE_CODE LEFT JOIN ecom2g.TD_PURCHASE_AGREEMENT b on a.FD_AGREEMENT_ID = b.FD_ID WHERE e.FD_PRODUCT_TYPE = ‘N’ and e.FD_IS_DELETE = 0]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在
我们不了解你的业务,但是从第一个 JPQL 翻译得到的 sql看,这个级联的 left join 可能有问题:
left join 的时候,这个表出现了2次,而且红框处的 on 语句是明显不对的。
你从业务角度看看这个语句能否优化一下?因为你select 第一个表,left join 后面两个表,不管后面两个表是否有数据,第一个表查出来的数据总是有的,关联后面两个表看上去没有用。