【问题标题】:What is the Java equivalent of Perl's qq operator?Perl 的 qq 运算符的 Java 等价物是什么?
【发布时间】:2011-03-23 12:25:15
【问题描述】:

我有一个很长的字符串,其中包含许多新行(这是一个非常长的 SQL 语句)。

当我用换行符分解 SQL 时,它更容易阅读。但有时我需要 从代码中复制sql语句粘贴到sql developer中。

在 Perl 中,我一直很喜欢 qq 运算符,您可以使用它来代替双引号:

你可以这样使用它:

$myString = qq{       
                      SELECT * 
                      FROM table_a a
                      JOIN table_b b ON a.id = b.id ... etc
                };

在 JAVA 中是否有等价物?我觉得必须像这样将字符串分成块很尴尬:

String myString = "    SELECT *  " + 
                  "    FROM table_a a " + 
                  "    JOIN table_b b ON a.id = b.id ... etc ";

而且很难从代码中复制 SQL 语句。我最终不得不删除所有引号和 +'s

是否有 Java 等价物?或者有没有更好的技巧将可读、可复制的 SQL 语句放入 Java 代码中?

【问题讨论】:

  • Perl 允许在普通带引号的字符串中使用换行符。 qqq 的目的是提供替代分隔符,因此您不必反斜杠引号。

标签: java perl syntax string operators


【解决方案1】:

这是我使用的 - 对我来说效果很好(我将第一条评论留给其他人)

// Tip: UltraEdit column-copy mode (alt-c) gets the SQL without quotes
String sql = 
    "select                                          " + 
   //-- comment here
    "big-long-query goes here...                     " +   
    "last line                                       ".replaceAll("\\s+", " ");

因此,在复制/粘贴到 SQL 工具之前,您必须有一个具有列突出显示模式的 ide 或其他编辑器(有人知道 Eclipse 是否这样做吗?)。

【讨论】:

    【解决方案2】:

    它现在不存在。 Java 7 中讨论了多行支持,但它很早就被淘汰了。

    我在做什么

    1. 我先加入所有行,然后将它们放在引号中。如果您在 Eclipse 之类的编辑器中将光标放在字符串内,然后按 Enter 键 Eclipse,IDE 将为您拆分字符串。所以你会得到一堆“尴尬”的序列 "line1" + "line2" ... .

    2. 我写了一个解析器来扫描地址。在测试时我遇到了同样的问题,因为地址线本质上是几行长。所以我改用 Groovy 来处理我的测试用例,因为 Groovy 提供多行字符串等等:http://groovy.codehaus.org/Strings+and+GString

    【讨论】:

      【解决方案3】:

      我有时会写一个类似的函数

      public static String cat(String ... lines) { }
      

      连接行并添加换行符。如果在编译时字符串是已知的,这是低效的。

      在 SQL 案例中,我同意 Bakkal - 使用包装库。帝国数据库很棒。 http://incubator.apache.org/empire-db/

      我不同意使用 O/R 框架的建议。

      【讨论】:

        【解决方案4】:

        Java 中的多行字符串

        有 Java 等价物吗?

        在撰写本文时,我不这么认为。但是有一个提议在 Java 中包含多行字符串。


        或者有没有更好的技巧 可读、可复制的 SQL 语句 Java 代码?

        通过连接将参数放入 SQL 查询中并不是一个好主意。有一些类和 API 可以帮助您形成查询。

        “查询包装器”

        包装器可以增强可读性,例如在 JDOQL (JDO) 中,您可以使用setWhere()setLimit()setDistinct() 等创建查询。

        Query q = pm.newQuery (...);
        q.setWhere(...);
        q.setRange (...);
        q.setOrdering (...);
        q.setLimit(...);
        q.newParameter(...); // declare a query parameter
        
        q.execute(34.5); // execute the SQL query with a parameter
        

        对于JPA,你可以阅读JPQL

        如果您使用的是普通 JDBC,您还可以查看 PreparedStatement

        【讨论】:

        • JPA 和 JDO 等规范的用途。
        • 谢谢,我希望有一些东西可以让我的生活更轻松一些。我现在使用 PreparedStatement 并将“?”替换为参数。如果我需要将 SQL 语句复制并粘贴到查询浏览器中,我总是可以 System.output
        【解决方案5】:

        没有等价物。另一种方法是将 SQL 放在属性文件中,然后使用 Properties 对象读入属性文件。

        你仍然有反斜杠,但没有所有引号那么多。

        SELECT * \
        FROM table_a a \
        JOIN table_b b ON a.id = b.id \
        

        【讨论】:

          猜你喜欢
          • 2017-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-20
          • 2010-09-22
          • 2017-08-19
          • 2011-03-25
          • 2023-04-04
          相关资源
          最近更新 更多