# Namensabfrage mit Schleife für HQL



## hamburger_1983 (24. Sep 2007)

Hallo, ich hoffe ich kann mein Problem detailliert genug schildern.

Also ich habe einen String, der einen Namen enthält (z.B: "Maier"). Der soll in eine Datenbank gespeichert werden, parallel soll aber überprüft werden, ob der Name (evtl. mit anderer Schreibweise) schon existiert.

Das klappt auch soweit. Der Code hierzu:


```
// Abfrage der EI/AI/EIH/EY/AY-Gruppe
        
String stringAi = "ai";
String stringEih = "eih";
String stringAy = "ay";
String stringEy = "ey";
String stringEi = "ei";
String stringIj = "eij";
String eiGroup = "";

if (pruefString.contains(stringIj)) {   eiGroup = stringIj;   }
else if (pruefString.contains(stringEi)) {   eiGroup = stringEi;   }
else if (pruefString.contains(stringAi)) {   eiGroup = stringAi;   }
else if (pruefString.contains(stringEih)) {   eiGroup = stringEih;   }
else if (pruefString.contains(stringEy)) {   eiGroup = stringEy;   }
else if (pruefString.contains(stringAy)) {   eiGroup = stringAy;   }
    	
if (pruefString.contains(eiGroup)) {
       	stringEi = pruefString.substring(0, pruefString.indexOf(eiGroup)) + stringEi + pruefString.substring(pruefString.indexOf(eiGroup)+eiGroup.length(), pruefString.length());
       	if (hql.endsWith("WHERE")) {
      		hql += " c." + abfrageFeld + " Like :stringEi";
       	}
      	else {
       		hql += " OR c." + abfrageFeld + " LIKE :stringEi";
       	}
      	stringAi = pruefString.substring(0, pruefString.indexOf(eiGroup)) + stringAi + pruefString.substring(pruefString.indexOf(eiGroup)+eiGroup.length(), pruefString.length()); 
       	hql += " OR c." + abfrageFeld + " LIKE :stringAi";
       	stringEih = pruefString.substring(0, pruefString.indexOf(eiGroup)) + stringEih + pruefString.substring(pruefString.indexOf(eiGroup)+eiGroup.length(), pruefString.length()); 
       	hql += " OR c." + abfrageFeld + " LIKE :stringEih";
       	stringEy = pruefString.substring(0, pruefString.indexOf(eiGroup)) + stringEy + pruefString.substring(pruefString.indexOf(eiGroup)+eiGroup.length(), pruefString.length()); 
       	hql += " OR c." + abfrageFeld + " LIKE :stringEy";
       	stringAy = pruefString.substring(0, pruefString.indexOf(eiGroup)) + stringAy + pruefString.substring(pruefString.indexOf(eiGroup)+eiGroup.length(), pruefString.length()); 
       	hql += " OR c." + abfrageFeld + " LIKE :stringAy";
       	stringIj = pruefString.substring(0, pruefString.indexOf(eiGroup)) + stringIj + pruefString.substring(pruefString.indexOf(eiGroup)+eiGroup.length(), pruefString.length()); 
       	hql += " OR c." + abfrageFeld + " LIKE :stringIj";
}
```

pruefString ist meine Name (Bsp.: Maier)

Nun überprüft er, ob [Meier, Maier, Mayer, Meyer, Meijer oder Meiher] existiert, egal in welcher Schreibweise ich Maier eingebe.

Nun gibt es aber Namen, wo "ei", "ai", "ey", "ay", "eij", "eih" mehr als einmal vorkommt.

Beispiel.: "Schweinsteiger"

Nun würde nur nach folgenden Schreibweisen geschaut.

- Schweinsteiger
- Schwainstaiger
- Schweynsteiger
- Schwaynsteiger
- Schweijnsteiger
- Schweihnsteiger

Aber im hinteren Teil steckt ja auch noch ein "ei" (...steiger)

Er soll also in dem Fal prüfen, ob folgende Kombinationen schon in der Datenbank vorhanen sind:

- Schw(ei/ai/ey/ay/eij/eih)nsteiger
- Schw(ei/ai/ey/ay/eij/eih)nstaiger
- Schw(ei/ai/ey/ay/eij/eih)nsteyger
- Schw(ei/ai/ey/ay/eij/eih)nstayger
- Schw(ei/ai/ey/ay/eij/eih)nsteijger
- Schw(ei/ai/ey/ay/eij/eih)nsteihger

Wie bekomme ich das hin? Ich habe da evtl. an eine For-Schleife gedacht, wüsste aber nicht, diese einzubauen.
[/code]


----------



## AlArenal (24. Sep 2007)

Man kann es sich auch schwer machen 

Google mal nach "SOUNDEX"...


----------



## hamburger_1983 (24. Sep 2007)

naja so ganz das wahre ist das in meinen Augen auch nicht. Vor allem wenn man mal bedenkt, dass "Britney Spears" und eine "bewährte Superzicke" phonetisch das gleiche ist 

Deswegen will ich das ja auch selber schreiben. Die Abfrage für jeden einzelnen Fall habe ich ja auch. Das Problem ist halt nur, dass keine Gruppe (z.B. Ei oder Äu) mehrfach vorkommen darf.


----------



## SlaterB (24. Sep 2007)

eine knifflige rekursive Variante:

du durchsuchst das Wort nach allen benötigten Teilen und bildest ein Array/ eine Liste der einzelnen Zwischen-Wortteile,
entweder per indexOf, was für sich schon ein ähnlich großes Problem ist
oder mit


```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {

        String st = "Schweinsteiger ";
        System.out.println(Arrays.toString(st.split("(ei|ai)")));

    }
}
```

dann kannst du eine rekursive Operation schreiben:

Berechnung der Liste der Kombinationen für eine Liste der Wortteile:
a) Liste X der Kombinationen für kleinere Liste der Wortteile ohne ersten Wortteil bestimmen,
b) für jedes Element y aus X 6 neue Ausdrücke erstellen: erstes Wortteil + eine der 6 'ei's + y


----------



## hamburger_1983 (24. Sep 2007)

Na prima, da steige ich gerade überhaupt nicht durch. Ich brauche doch nur so etwas wie eine einfache for-Schleife

Ich kenne mich da auch nicht ganz so aus. Geht es eigentlich wenn ich eine Methode ueberpruefe() aufbaue, wo ich alle Algorithmen einbaue und dann in der Zeile


```
stringEy = pruefString.substring(0, pruefString.indexOf(eiGroup)) + stringEy + pruefString.substring(pruefString.indexOf(eiGroup)+eiGroup.length(), pruefString.length());
```

Das "pruefString.substring(0, pruefString.indexOf(eiGroup))" in "pruefString.substring(0, pruefString.indexOf(eiGroup)).ueberpruefe()" oder so ähnlich umwandel, womit ich ihm dann sage, er soll für den substring das ganze nochmal durchlaufen.


----------

