# String über mehrere Zeilen



## rumpel84 (5. Jan 2010)

Hallo,

wie kann man einfach einen String über mehrere Zeilen schreiben, ohne jedesmal + und Anführungszeichen einfügen zu müssen?
Das nervt bei langen SQL Statements tierisch :-(

```
String sql = "SELECT * "
              + "FROM dual "
              + "WHERE 1=1";
```

In C# funktioniert es so:

```
String sql = @"SELECT * 
                    FROM dual 
                   WHERE 1=1";
```

Danke im Voraus


----------



## Zenic (5. Jan 2010)

Ich weiß nicht ob ich dein Problem jetzt richtig verstanden habe, aber wie wäre es mit einem Zeilenumbruch (\n)?
Bsp:

```
String sql = "SELECT * \nFROM dual \nWHERE 1=1";
```

Wobei es mich ehrlich gesagt wundert das er bei +"String" eine neue Zeile macht. Oder soll der String im Code über mehrere Zeilen geschrieben stehen?


----------



## Schumi (5. Jan 2010)

Ja, er meint es im Code. Eclipse macht das automatisch, wenn man beim Editieren innerhalb eines Strings ist und Return drückt. Ansonsten müsste man wohl den Delimiter des Compilers ändern... ob das sinnvoll ist bzw. geht?


----------



## ARadauer (5. Jan 2010)

nicht jeder ist pefekt... auch nicht java ;-)


----------



## Oli (5. Jan 2010)

Hi,

in Visual Studio ist ein String erst dann beendet, wenn das schließende Anführungszeichen vorhanden ist. Zeilenumbrüche im Code werden in der Entwicklungsumgebung dargestellt, aber nicht im String übernommen.

In Eclipse ist das nur mit + und " möglich.


Was jetzt besser ist, kann ich auch nicht sagen. Ich hab mich an beides gewöhnt...

Grüße


----------



## Oli (5. Jan 2010)

@ Zenic

Wenn du

String sql = "SELECT * \nFROM dual \nWHERE 1=1";

als Datenbankabfrage absendest wird es böse krachen ;-)


----------



## Oni (5. Jan 2010)

Du könntest das Ganze auch so schreiben: 


```
StringBuilder sb = new StringBuilder();
sb.append("SELECT * ");
sb.append("FROM dual ");
sb.append("WHERE 1=1");

String sql = sb.toString();
```

Hat auch den Vorteil das nicht soviel String-Object erzeugt werden.


----------



## Zenic (5. Jan 2010)

Kenn mich mit Datenbanken (noch) nicht aus, aber mir ist der Sinn der Darstellung im Code, über mehrere Zeilen nicht klar, deshalb habe ich das nicht in Betracht gezogen.

Zum Thema: Hab jetzt leider kein Eclipse hier und kann es deshalb nicht testen, aber kann das nicht die IDE für einen übernehmen?

Edit: Onis Vorschlag ist für die Performance von langen Statements sicher besser, aber Arbeitserleichterung ist das keine


----------



## faetzminator (5. Jan 2010)

Mit SQL und Java sollte man sowieso _Prepaired Statements_ verwenden. Die Query dazu würde sich noch in eine Property-Datei auslagern lassen und das Einfügen der Werte funktioniert da sowieso Zeile für Zeile. Somit wäre das Problem mit formatierten Statements behoben.


----------



## rumpel84 (6. Jan 2010)

es geht nur darum, lange sql statements in der IDE darzustellen (Netbeans). \n hilft also nicht weiter.

Die statements müssen öfter  geändert und zwischen IDE und DB Tool hin und her kopiert werden und es nervt dann jedesmal die ganzen + "" hinzuzufügen bzw. zu entfernen.


----------



## SlaterB (6. Jan 2010)

wenn du erstmal Hibernate mit HQL verwendest, kannst du das kopieren eh knicken 

Java kann das bisher nicht, 
brauchbare Alternative wäre nur, die SQL-Texte in Textdateien auszulagern, 
durch die Trennung fachlich vielleicht nicht ideal, aber zumindest technisch im Programm kein Nachteil,
wenn du dort einen String änderst, müsstest du kompilieren und neu starten,
wenn da nur 
String sql = loadSQLFromFile(322);
steht, könnte die Textdatei der Eintrag 322 auch zur Laufzeit geändert werden


----------



## Thomas Anonym (21. Jan 2011)

SlaterB hat gesagt.:


> brauchbare Alternative wäre nur, die SQL-Texte in Textdateien auszulagern



Wie willst Du denn dann die Sache mit Tabellennamen/Feldnamen sinnvoll behandeln? Ich weiß ja nicht wie der Poster das handhabt aber ich kenne keine Umgebung bei der "Tabelle.Feld" in einem SQL-String fix drin steht. Bei uns sieht das eher so aus:


```
String where = TblEmployee.EColumns.lastName.getName() + " like ...";
```

Pro Tabelle gibt es eine Klasse und die hat immer einen generierten Enum EColumns mit allen Columns und die wiederum haben dann eine getName() genauso wie die Tabelle Ihren Namen verrät. Anders ist man doch bei jeder DB-Änderung (Schreibfehler in Feldname ändern, ...) aufgeschmissen und darf stundenlang Textsuchen machen. So geht das über ein simples Refactoring.

Aber zurück zum Thema: Ich verwende auch die Version mit dem StringBuilder einfach weil es deutlich schneller ist als eine lange Kette von "xxx" + "xxx" + "xxx" + "xxx" + "xxx" + "xxx"!


----------



## FArt (21. Jan 2011)

Oni hat gesagt.:


> Hat auch den Vorteil das nicht soviel String-Object erzeugt werden.





Thomas Anonym hat gesagt.:


> Aber zurück zum Thema: Ich verwende auch die Version mit dem StringBuilder einfach weil es deutlich schneller ist als eine lange Kette von "xxx" + "xxx" + "xxx" + "xxx" + "xxx" + "xxx"!



Beides ist prinzipiell wahr, aber die Arbeit muss man sich nicht machen: der Compiler wandelt Stringkontatination mit + sowieso selbständig um... also nehme ich die Version, die prinzipiell weniger Arbeit macht und lesbarer ist ;-)
Also doch nicht wahr...


----------



## tfa (21. Jan 2011)

> Aber zurück zum Thema: Ich verwende auch die Version mit dem StringBuilder einfach weil es deutlich schneller ist als eine lange Kette von "xxx" + "xxx" + "xxx" + "xxx" + "xxx" + "xxx"!


Das ist genau gleich schnell, denn eine lange Kette von "xxx" + "xxx" + "xxx" + "xxx" + "xxx" + "xxx" wird vom Compiler durch einen StringBuilder ersetzt. Nur wenn man + innerhalb einer Schleife benutzt, ist das schlecht für die Performance.
Wenn man nur Stringkonstanten konkateniert wie im Beispiel oben, wird sogar gleich ein fertiger String in den Bytecode geschrieben. Der StringBuilder wird wegoptimiert.


----------



## TobiasPahl (27. Nov 2012)

Die Antwort (StackOverflow):
eclipse - Surround with quotation marks - Stack Overflow

Eclipse hat eine Option zum Kopieren und Einfügen von Text aus mehreren Zeilen in Zeichenfolgenliterale:

    Preferences / Java / Editor / Typing / "Escape to Text in ein String-Literal paste"


----------



## Oli (27. Nov 2012)

Hast du mal geschaut, wann hier der letzte Beitrag geschrieben wurde??? :lol:


----------

