我有一些Java代码与SQL语句编写为Java字符串(请不要OR/M火焰战争,嵌入式SQL是什么-不是我的决定)。

为了便于维护,我在几行代码中从语义上将SQL语句分解为几个连接在一起的字符串。所以不是这样的:

String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4";

我有这样的东西:

String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";

这种风格使SQL更容易阅读和维护(IMHO),特别是对于较大的查询。例如,我可以将编辑器设置为“覆盖”模式,并相当容易地就地修改文本。

注意,这个问题不仅仅局限于SQL的特定示例。任何使用任何垂直格式编写的代码,特别是表格结构,都很容易被漂亮的打印机破坏。

现在,一些项目成员使用Eclipse编辑器,当他们格式化整个源文件时,语义格式经常会被破坏。

是否有一种方法可以指示Eclipse在格式化方面忽略源代码中的某些行?

我正在寻找类似于切换Eclipse格式化器的特殊注释之类的东西。理想情况下,这样的注释可以配置为我们选择的任何格式,其他格式化器也可以编程来尊重它:

// STOP-ECLIPSE-FORMATTING
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
// START-ECLIPSE-FORMATTING

显然,一种“解决方案”是让我们的团队成员对一些外部格式化器(如Jalopy或JIndent)进行标准化,但这不是这个问题的重点(也不是我对这个项目的决定):我正在特别地寻找一种避免Eclipse格式化器的方法。

理想情况下,一个解决方案将允许我为Eclipse格式化器插入指令,而不需要使用Eclipse的团队成员进行任何IDE重新配置(除了可能选择与格式化器无关的命令注释:STOP-ECLIPSE-FORMATTING→STOP-FORMATTING)。


当前回答

我使用了固定宽度的字符串部分(用空格填充),以避免格式化程序弄乱SQL字符串缩进。这将给您带来复杂的结果,并且在SQL中不忽略空白的情况下将不起作用,但可能是有帮助的。

    final String sql = "SELECT v.value FROM properties p               "
            + "JOIN property_values v ON p.property_id = v.property_id "
            + "WHERE p.product_id = ?                                  "
            + "AND v.value        IS NOT NULL                          ";

其他回答

您必须打开添加格式化程序标记的功能。在菜单栏转到:

窗户 → 首选项 Java → 代码风格 → 格式化程序

按下编辑按钮。选择最后一个选项卡。注意On/Off框,并用复选框启用它们。

Eclipse 3.6允许您通过放置一个特殊的注释来关闭格式化,例如

// @formatter:off
...
// @formatter:on

必须在Eclipse首选项中打开/关闭功能:Java > Code Style > Formatter。点击编辑,关闭/打开标签,启用启用关闭/打开标签。

也可以在首选项中更改神奇的字符串——请在这里查看Eclipse 3.6文档。

更多的信息

Java > 代码风格 > 格式化程序 > 编辑 > /在标签

这个首选项允许你定义一个标签来禁用和一个标签来启用格式化器(参见格式化器配置文件中的Off/On Tags选项卡):

您还需要启用Java Formatting中的标志

我使用了固定宽度的字符串部分(用空格填充),以避免格式化程序弄乱SQL字符串缩进。这将给您带来复杂的结果,并且在SQL中不忽略空白的情况下将不起作用,但可能是有帮助的。

    final String sql = "SELECT v.value FROM properties p               "
            + "JOIN property_values v ON p.property_id = v.property_id "
            + "WHERE p.product_id = ?                                  "
            + "AND v.value        IS NOT NULL                          ";

另一种方法:在Eclipse 3.6中,在“换行”下的“常规设置”中有一个选项“永不连接已经换行的行”。这意味着格式化程序将对长行进行换行,但不会撤销您已有的任何换行。

如果你把加号放在行首,它的格式就不同了:

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";