2012-12-10 7 views
5

Ich baue eine Play2 App mit Ebean. Ich habe immer Locations durch eine Liste von Ids eine Serviceklasse mit einem Verfahren erstellt:Wie wähle ich in Liste mit Ebean createSqlQuery

public static List<Venue> getVenuesForIds(List<Long> list){   
    ArrayList<Venue> venues = new ArrayList<Venue>(); 
    String sql = "select c.id, c.name from Company c where in (:ids)"; 
    List<SqlRow> sqlRows = 
       Ebean.createSqlQuery(sql).setParameter("ids", list).findList();   
    for(SqlRow row : sqlRows) { 
     venues.add(new Venue(row.getLong("id"), row.getString("name"))); 
    }   
    return venues; 
} 

Aber ich bin immer:

[PersistenceException: Query threw SQLException:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'in (201639091,201637666)' at line 1 Query was: select c.id, c.name from Company c where in (?,?) ] 

ich durch http://www.avaje.org/ebean/introquery.html gelesen haben verpasste aber wahrscheinlich die richtige Syntax. Ich möchte dies in rohen SQL tun. Was habe ich verpasst?

+0

Einfach nur neugierig: 'Venue' ist ein Modellname, die Tabelle der ist' Gesellschaft den oder Du die Auswahl mit ihm von anderen Modellobjekten? – biesior

+0

Hallo! Ich bin Zugriff auf die Datenbank von einer neuen App, wo Veranstaltungsort passenderen Namen für das Unternehmen ist. – jakob

Antwort

3

Ihre Anfrage nicht korrekt zu sein scheinen.

Was:

"select c.id, c.name from Company c where c.id in (:ids)"; 
+0

Ja natürlich! Vielen Dank! – jakob

3

Sie brauchen nicht so ‚anspruchsvolle‘ Abfrage ausführen, wird es gut genug sein, wenn Sie gemeinsam Finder<I,T> in Ihrem Venue Modell verwenden werden (einmal):

@Entity 
@Table(name = "Company") 
public class Venue extends Model { 

    @Id 
    public Long id; 
    public String name; 
    // other fields 

    public static Finder<Long, Venue> find 
      = new Finder<Long, Venue>(Long.class, Venue.class); 
} 

So können Sie die gleiche Aufgabe tun mit ... einziger Code-Zeile in Ihrer Methode:

public static List<Venue> getVenuesForIds(List<Long> ids){   
    return Venue.find.select("id,name").where().idIn(ids).findList(); 
} 

oder mit ähnlicher expresion:

public static List<Venue> getVenuesForIds(List<Long> ids){   
    return Venue.find.select("id,name").where().in("id",ids).findList(); 
} 
+0

Vielen Dank und Sie befinden sich natürlich richtig! Aber in diesem Fall möchte ich raw sql verwenden, da ich Joins später ausführen werde und ich die Entitäten dafür nicht in meinem Code erstellen möchte. – jakob