当前位置: 首页 > 知识库问答 >
问题:

公共表表达式,以值开头的语句在 java 中给出错误

陶富
2023-03-14

我有这个 CTE,我会在 Java 中实现:
它在 IBM 伊塞尔 7.3 DB2 机器上运行。

WITH params (from_date, to_date, outlet, product_number)
AS (
    values(TO_DATE('01.11.2018', 'DD.MM.YYYY'),
        TO_DATE('18.12.2018', 'DD.MM.YYYY'),
        'BLK' ,
        49 )
    ),
product
AS (
    SELECT DISTINCT cpp.competitor_products_id product
    FROM yxdb.competitor_product_prices cpp
    INNER JOIN yxdb.competitor_products_comparisons cpc ON cpc.competitor_products_id = cpp.competitor_products_id
        AND cpc.deleted = 0
    INNER JOIN yxdb.outlets o ON o.outlets_id = cpc.outlets_id
        AND o.deleted = 0
    INNER JOIN params ON cpp.price_date > params.from_date
        AND cpc.product_number = params.product_number
        AND o.short_name = params.outlet
    WHERE cpp.deleted = 0
    )
select * from product;

它要长得多,所以params表被多次使用
在Java中实现时,我将Java中的硬编码日期和其他参数替换为?1.2等。我也尝试过命名参数,但都不起作用。它们都给出了<code>[SQL0418],参数标记或NULL的使用无效。

Java 代码片段:

@RepositoryRestResource
    public interface CompetitorPriceDateRepository extends JpaRepository<CompetitorPriceDateEntity, Long> {
    @Query(value = "WITH params (from_date, to_date, outlet, product_number) "
                + " AS ( "
                + "     values(TO_DATE( :fromDate , 'DD.MM.YYYY'), "
                + "         TO_DATE( :toDate , 'DD.MM.YYYY'), "
                + "         :outlet , "
                + "         :productNumber ) "
                + "     ), "
                + " product "
                + " AS ( "
                + "     SELECT DISTINCT cpp.competitor_products_id product "
                + "     FROM yxdb.competitor_product_prices cpp "
                + "     INNER JOIN yxdb.competitor_products_comparisons cpc ON +" cpc.competitor_products_id = cpp.competitor_products_id "
                + "         AND cpc.deleted = 0 "
                + "     INNER JOIN yxdb.outlets o ON o.outlets_id = cpc.outlets_id "
                + "         AND o.deleted = 0 "
                + "     INNER JOIN params ON cpp.price_date > params.from_date "
                + "         AND cpc.product_number = params.product_number "
                + "         AND o.short_name = params.outlet "
                + "     WHERE cpp.deleted = 0 "
                + "     ) "
                + " select * from product ",nativeQuery = true) 
    List<CompetitorPriceDateEntity> findAllInterpolatedByDates(
                    @Param("productNumber") Integer productNumber,
                    @Param("outlet") String outlet,
                    @Param("fromDate") String fromDate,
                    @Param("toDate") String toDate
            );

共有1个答案

邓开济
2023-03-14

如果没有栈跟踪,我对你的查询有什么问题没有任何帮助。SQL看起来很扎实。

尝试使用命名的本机查询

@Entity
@NamedNativeQuery(
        name = “competitor.findProducts.byDateOutletProductnumber", 
        query = "WITH params (from_date, to_date, outlet, product_number) "
            + " AS ( "
            + "     values(TO_DATE( :fromDate , 'DD.MM.YYYY'), "
            + "         TO_DATE( :toDate , 'DD.MM.YYYY'), "
            + "         :outlet , "
            + "         :productNumber ) "
            + "     ), "
            + " product "
            + " AS ( "
            + "     SELECT DISTINCT cpp.competitor_products_id product "
            + "     FROM yxdb.competitor_product_prices cpp "
            + "     INNER JOIN yxdb.competitor_products_comparisons cpc ON +" cpc.competitor_products_id = cpp.competitor_products_id "
            + "         AND cpc.deleted = 0 "
            + "     INNER JOIN yxdb.outlets o ON o.outlets_id = cpc.outlets_id "
            + "         AND o.deleted = 0 "
            + "     INNER JOIN params ON cpp.price_date > params.from_date "
            + "         AND cpc.product_number = params.product_number "
            + "         AND o.short_name = params.outlet "
            + "     WHERE cpp.deleted = 0 "
            + "     ) "
            + " select * from product ", 
        hints = { 
            @QueryHint(name = "org.hibernate.cacheable", value = "true") })
public class CompetitorPriceDateEntity { ... }

好处1:命名查询是预编译的,所以jpa不需要在每次被调用时都将查询编译成可执行的标准。

专业奖金2:查询提示可缓存或eclipselink等效

 类似资料:
  • 问题内容: 我基本上是在完善,完成并尝试从Java初学者的参考书中编译测试代码。目的是创建一个猜谜游戏,其中目标位于3个连续的单元格中(我将位置保持在数组中),而用户则猜测该单元格的编号。逐个摧毁目标细胞。 我在这里检查了六则关于同一错误的帖子,但我无法弄清楚出了什么问题。 这是我的错误: 我的代码是: 问题答案: 方法只能声明局部变量。这就是为什么当您尝试将其声明为public时,编译器会报告错

  • 问题内容: 如何在Java正则表达式中表示“无前缀”?例如,我只想搜索“:”,但仅在它不直接以“ \”开头时。我怎样才能做到这一点? 问题答案: 在后面使用负数: 四个反斜杠的原因是: 反斜杠是正则表达式中的特殊字符,因此您需要正则表达式来匹配单个反斜杠。 必须在Java字符串中对反斜杠进行转义,因此上述每个反斜杠必须都写为,总共为四个。 示例代码: 输出:

  • 我们在前面的小节中,已经学习了变量和运算符。有了这些前置知识,我们就可以学习表达式、语句和块了。 运算符可用于构建表达式,表达式可以进行值的计算,它是语句的核心组成部分;而语句是指令式编程语言中最小的独立元素;多条语句又可以组成语句块。本小节我们将学习表达式的概念和常用分类,也将了解到什么是语句和块。 1. 表达式 1.1 概念 表达式,是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等

  • 在使用带有xpath的正则表达式时,我对jayway jsonpath有意见。以下是我的json: 下面是我的表达式:resources[?(/_test1.CREDITPRINTFILE/.test(@.name))] 我得到以下错误: 我也尝试在在线评估工具中使用同样的表达:https://jsonpath.herokuapp.com/ Jayway-给出了相同的错误-预期路径节点Gatlin

  • 问题内容: 我正在尝试创建一个switch语句,但似乎无法使用被求值的表达式(而不是设置的字符串/整数)。我可以轻松地使用if语句来执行此操作,但希望大小写应该更快。 我正在尝试以下 我缺少明显的东西吗?Google在这种情况下并不友好。 任何帮助/指针表示赞赏 问题答案: 你总是可以做 它之所以有效是因为它是一个常量,因此将执行第一个case语句下带有计算结果为true的表达式的代码。 我猜这有

  • 问题内容: 我有一个查询,可以使用公用表表达式来检索页面的所有模块和子模块。是否可以多次使用cte的结果? 例子 第一个选择有效,但是第二个选择引发错误“无效的对象名称’child_modules’”。 问题答案: 从该手册: 指定一个临时的命名结果集,称为公用表表达式(CTE)。这是从一个简单的查询派生的,并 在 单个 SELECT,INSERT,UPDATE或DELETE语句的执行范围内定义