【问题标题】:Spring JPA long SQL String for NativeQuery用于 NativeQuery 的 Spring JPA 长 SQL 字符串
【发布时间】:2020-09-26 03:38:39
【问题描述】:

在我的 Spring JPA 项目中,我有一个这样的 repo 文件:

@Repository
public interface StudentRepository extends JpaRepository<Student, Integer>{

@Query(value = "select * from students", nativeQuery = true)
public List<Student> findStudents(
        @Param("keyword") String keyword
        );
}

有了这个,我仍然可以复制粘贴 SQL 并在我的数据库软件中运行。

但是当涉及到大型查询时:

    @Query(value = "SELECT\n" + 
        "*\n" + 
        "FROM\n" + 
        "students\n" + 
        "WHERE\n" + 
        "(\n" + 
        "`id` LIKE CONCAT('%', :keyword, '%') OR\n" + 
        "`name` LIKE  CONCAT('%', :keyword, '%') OR\n" + 
        "`desc` LIKE  CONCAT('%', :keyword, '%') OR\n" + 
        "`sex` LIKE  CONCAT('%', :keyword, '%')\n" + 
        ")", nativeQuery = true)
public List<Student> findStudents(
        @Param("keyword") String keyword
        );

我不能直接复制粘贴并在DB软件中运行,我必须删除“+”“\n”字符。 我试过 Java 的 """SQL_QUERY_STRING""" 但它不允许。

有没有其他方法可以解决这个问题?

更新

我尝试了三重双引号,但它给出了:

字符串文字没有被双引号正确关闭

【问题讨论】:

标签: java spring spring-boot java-8 jpql


【解决方案1】:

我尝试了@Andronicus 的方法,但对我来说不起作用。

我解决它的方法是创建一个新目录和文件:
/src/main/resources/META-INF/orm.xml

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
    http://java.sun.com/xml/ns/persistence/orm_2_0.xsd ">

<named-native-query name="Student.findStudents" result- 
class="path/package_to_student_class">
    <query>
        SELECT
        *
        FROM
        student
        WHERE
        (
        `id` LIKE CONCAT('%', :keyword, '%') OR
        `name` LIKE CONCAT('%', :keyword, '%') OR
        `desc` LIKE CONCAT('%', :keyword, '%') OR
        `sex` LIKE CONCAT('%', :keyword, '%') OR
        )
    </query>
</named-native-query>
</entity-mappings>

【讨论】:

    【解决方案2】:

    JEP 355 引入了多行字符串。您可以利用它们简单地复制粘贴 sql:

    @Query(value = 
    """
        select * 
        from students
        ...
    """, nativeQuery = true)
    

    请注意,它是在 java 13 中作为预览引入的。因此,您至少需要升级到 java 13 并启用预览功能才能使用它。

    如果没有,您可以通过用空格替换换行符来提高可读性:

    @Query(value = "SELECT " + 
        "FROM " + 
        "students " + 
        ...
    

    【讨论】:

    • 我不能,看看我的更新,它给出了错误“字符串文字没有被双引号正确关闭”。
    • @HenryLowCZ 你用的是什么版本的java?
    • 我的Java版本是jdk1.8.0_211
    • @HenryLowCZ 你检查我给的链接了吗?它说,此功能在 java 13 中可用。
    • 我已经从这个链接 jdk.java.net/archive 下载了 13.0.2。我已将 jdk 添加到环境变量中,并在 Eclipse > Windows 首选项中添加了已安装的 JRE。我什至重置了我的项目的 JRE 系统库,但错误仍然是一样的
    猜你喜欢
    • 2022-01-21
    • 2014-07-16
    • 2019-01-27
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多