【问题标题】:Issue with executing native SQL query in Hibernate [duplicate]在 Hibernate 中执行本机 SQL 查询的问题 [重复]
【发布时间】:2014-06-10 06:13:02
【问题描述】:

我有一个需要执行的 SQL 查询,但由于 Hibernate,我在执行时发现了一些问题。

我的查询在属性键中设置 - sampleQuery 如下

SELECT * FROM (SELECT lcl.line_nr line_nr, lcl.LINE_NR_SHRT_DESC_TXT LINE_NR_SHRT_DESC_TXT, mf.FSC_CD FSC_CD, mf.LCL_PRFL_CD LCL_PRFL_CD, NVL(mfi.SML_img_mrktg_fsc_path_txt, NVL (mfi.SML_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS small, NVL (mfi.lrg_img_mrktg_fsc_path_txt, NVL(mfi.LRG_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS large, NVL (mfi.XL_img_mrktg_fsc_path_txt, NVL (mfi.XL_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS xl FROM lcl_line_nr_lang lcl, mrkt_fsc mf, mrkt_fsc_img mfi WHERE lcl.mrkt_id = :mrkt_id AND lcl.lang_cd =:lang_cd AND lcl.cmpgn_nr =:cmpgn_nr AND lcl.cmpgn_yr_nr =:cmpgn_yr_nr AND lcl.mrkt_id = mf.mrkt_id AND lcl.item_fsc_nr = mf.item_fsc_nr AND mf.mrkt_id = mfi.mrkt_id(+)AND mf.mrkt_fsc_id = mfi.mrkt_fsc_id(+)) a WHERE (a.large = '' OR a.large IS NULL OR a.xl = '' OR a.xl IS NULL OR a.small = '' OR a.small IS NULL)

DAOImpl 类 - 我正在尝试像这样执行它 -

            try
            {
            String queryString =appQueryLoad.getProperty("sampleQuery");
            Query fetchQuery=sessionODS.createSQLQuery(queryString);
            logger.info("Query to fetch ctgry details :"+queryString);

            fetchQuery.setParameter("mrkt_id",imt.getMrktId());
            fetchQuery.setParameter("cmpgn_nr","1");
            fetchQuery.setParameter("cmpgn_yr_nr","2014");
            fetchQuery.setParameter("lang_cd","uk_UK");

            fetchQuery.setCacheable(true);
            logger.debug(fetchQuery.list());
            sessionODS.getTransaction().commit();
            }
            catch(Exception e){
            logger.error("Error in retrieving the Shades details",e);
            sessionODS.getTransaction().rollback();
            }

现在的问题是在执行语句中 logger.debug(fetchQuery.list()); 在我调试时抛出如下异常。

Hibernate:SELECT * FROM (SELECT lcl.line_nr line_nr, lcl.LINE_NR_SHRT_DESC_TXT LINE_NR_SHRT_DESC_TXT, mf.FSC_CD FSC_CD, mf.LCL_PRFL_CD LCL_PRFL_CD, NVL(mfi.SML_img_mrktg_fsc_path_txt, NVL (mfi.SML_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS small, NVL (mfi.lrg_img_mrktg_fsc_path_txt, NVL(mfi.LRG_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS large, NVL (mfi.XL_img_mrktg_fsc_path_txt, NVL (mfi.XL_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS xl FROM lcl_line_nr_lang lcl, mrkt_fsc mf, mrkt_fsc_img mfi WHERE lcl.mrkt_id = :mrkt_id AND lcl.lang_cd =:lang_cd AND lcl.cmpgn_nr =:cmpgn_nr AND lcl.cmpgn_yr_nr =:cmpgn_yr_nr AND lcl.mrkt_id = mf.mrkt_id AND lcl.item_fsc_nr = mf.item_fsc_nr AND mf.mrkt_id = mfi.mrkt_id(+)AND mf.mrkt_fsc_id = mfi.mrkt_fsc_id(+)) a WHERE (a.large = '' OR a.large IS NULL OR a.xl = '' OR a.xl IS NULL OR a.small = '' OR a.small IS NULL)

我尝试在我的 Toad 上运行它,我得到了 1 行作为传递参数的结果,但在 Java 中我在执行时看到了问题。 你能帮我执行这个有很多连接的查询吗?

如果需要更多详细信息,请告诉我。

技术信息:我使用 Struts-2 框架和 Hibernate。

【问题讨论】:

  • @Roman - 嗨。这是我与问题共享查询和参数的地方。这有点相关,因为问题基于相同的概念。我会记住这一点。对不起。
  • Roman、Clockwork-mus、Elliot - 我还没有解决办法。我认为在这个问题中我清楚地提到了这个要求以及我当前的代码。让我明确一点,这不是我故意重复输入的行为。

标签: java sql hibernate struts2


【解决方案1】:
final Session session = sessionFactory.openSession();
String str =  " SELECT * FROM (SELECT lcl.line_nr line_nr, lcl.LINE_NR_SHRT_DESC_TXT LINE_NR_SHRT_DESC_TXT, mf.FSC_CD FSC_CD, mf.LCL_PRFL_CD LCL_PRFL_CD, NVL(mfi.SML_img_mrktg_fsc_path_txt, NVL (mfi.SML_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS small, NVL (mfi.lrg_img_mrktg_fsc_path_txt, NVL(mfi.LRG_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS large, NVL (mfi.XL_img_mrktg_fsc_path_txt, NVL (mfi.XL_IMG_MRKTG_CNCPT_PATH_TXT, '')) AS xl FROM lcl_line_nr_lang lcl, mrkt_fsc mf, mrkt_fsc_img mfi WHERE lcl.mrkt_id = mrkt_id AND lcl.lang_cd = lang_cd AND lcl.cmpgn_nr = cmpgn_nr AND lcl.cmpgn_yr_nr = cmpgn_yr_nr AND lcl.mrkt_id = mf.mrkt_id AND lcl.item_fsc_nr = mf.item_fsc_nr AND mf.mrkt_id = mfi.mrkt_id(+)AND mf.mrkt_fsc_id = mfi.mrkt_fsc_id(+)) a WHERE (a.large = '' OR a.large IS NULL OR a.xl = '' OR a.xl IS NULL OR a.small = '' OR a.small IS NULL)" ;
SQLQuery q = session.createSQLQuery(str);
List<Object[]> entities = q.list();
for (Object[] entity : entities) {
    for (Object entityCol : entity) {
        System.out.print(" " + entityCol);
    }
    System.out.println("");
}

试试这个。希望对你有帮助

【讨论】:

  • 如何传递这4个参数?请你也定义一下吗?
  • 简单的方法,将它们添加到我们现有的字符串中,例如 a.small='"+value+"' where value that come in your method
  • public List getList(String a , String b) { final Session session = sessionFactory.openSession(); String str = "select * from table where a='"+a+"' and b='"+b+"'" ; SQLQuery q = session.createSQLQuery(str); List 实体 = q.list(); for (Object[] entity : entity) { for (Object entityCol : entity) { System.out.print(" " + entityCol); } System.out.println(""); } }
  • 以上代码将帮助您如何将参数传递给查询
  • 你的回答对我来说似乎有点混乱。因为我无法理解为什么您在回答帖子中没有提到任何有关参数分配的内容。上面的评论看起来很清楚,但它不起作用。 :(如果可以的话,你能给我一个sn-p我发布的同一个查询吗?参数是-mrkt_id,cmpgn_nr,cmpgn_yr_nr,lang_cd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
相关资源
最近更新 更多