oracle 使用DBMS_LOB.SUBSTR函数的JQPL

8yoxcaq7  于 2023-03-22  发布在  Oracle
关注(0)|答案(2)|浏览(234)

Intellij IDE无法识别[在此处输入图像描述]
@Query("SELECT distinct new com.product.dto.ProductDescriptionsDto" + " (p.id, p.type, CAST(DBMS_LOB.SUBSTR(p.description,4000,1) AS string )) FROM Prodcut p " " WHERE p.code = :code and p.language = :language " ) List<ProductDescriptionsDto> find(@Param("code") String code , @Param("language") String language);https://i.stack.imgur.com/CYaF5.png
我们如何使用它?
我等待它将被转换为正确的sql,但我没有看到它

9lowa7mx

9lowa7mx1#

SELECT distinct
       new com.product.dto.ProductDescriptionsDto(
         p.id,
         p.type,
         CAST(DBMS_LOB.SUBSTR(p.description,4000,1) AS string )
       )
FROM   Prodcut p
WHERE  p.code = :code
and    p.language = :language

看起来你试图将Java和SQL混合到一个语句中,你所拥有的不是有效的Java(因为你使用的是SQL语句),也不是有效的SQL,因为a.b.c将是有效的语法,就像schema_name.package_name.function_name一样,但a.b.c.d不是有效的语法(除非你正在解引用对象派生的表,在这种情况下,使用NEW关键字将是无效的)。
如果你试图从SQL调用一个Java函数,那么把Java函数 Package 在一个SQL函数中(类似于,未经测试):

CREATE AND COMPILE JAVA SOURCE NAMED ProductDescriptions AS
public class ProductDescriptions {
  public static String ProductDescriptionsDto(
    id          int,
    type        String,
    description String
  )
  {
    return com.product.dto.ProductDescriptionsDto(id, type, description);
  }
}

然后你需要创建一个PL/SQL函数来调用Java类的函数:

CREATE FUNCTION ProductDescriptions(
  in_id          IN NUMBER,
  in_type        IN VARCHAR2,
  in_description IN VARCHAR2
) RETURN VARCHAR2
AS LANGUAGE JAVA NAME 'ProductDescriptions.ProductDescriptionsDto(int, java.lang.String, java.lang.String) return java.lang.String';
/

然后SQL代码看起来像这样:

SELECT distinct 
       ProductDescriptions(
         p.id,
         p.type,
         CAST(DBMS_LOB.SUBSTR(p.description,4000,1) AS string )
       )
FROM   Prodcut p
WHERE  p.code = :code
and    p.language = :language

如果您试图调用Java类构造函数,那么您需要使用类似this answer的东西从Java类Map到Oracle类型。
如果你正在做其他事情,那么你需要解释你试图实现的目标,因为你的代码不清楚。

gzjq41n4

gzjq41n42#

请检查:How to call custom database functions with JPA and Hibernate
对你来说就是

@Query(
 "SELECT distinct "
 + "new com.product.dto.ProductDescriptionsDto(p.id, p.type, function('DBMS_LOB.SUBSTR', p.description, 4000, 1)) "
 + "FROM Prodcut p WHERE p.code = :code and p.language = :language "
) 
List<ProductDescriptionsDto> find(@Param("code") String code , @Param("language") String language);

相关问题