2012-12-10 12 views
5

Buduję aplikację Play2 z Ebean. Stworzyłem klasę usług z metodą uzyskania lokali przez listę identyfikatorów:Jak mogę wybrać na liście z 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; 
} 

Ale ja dostaję:

[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 (?,?) ] 

Czytałem przez http://www.avaje.org/ebean/introquery.html ale prawdopodobnie brakowało poprawnej składni. Chcę to zrobić w raw sql. Co przeoczyłem?

+0

prostu ciekawi: 'Venue' jest model, który jest nazwa tabeli' kompania lub zaznaczania obiektów z nią z innego modelu? – biesior

+0

Hello! Mam dostęp do bazy danych z nowej aplikacji, w której miejsce jest bardziej odpowiednią nazwą jednostki. – jakob

Odpowiedz

3

Twoje zapytanie nie wydaje się prawidłowe.

Co o:

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

Tak, oczywiście! Dziękuję Ci! – jakob

3

Nie trzeba wykonywać takie „wyszukane” zapytanie, to będzie wystarczająco dobre, jeśli będziesz używać wspólnego Finder<I,T> w modelu Venue (raz):

@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); 
} 

Tak więc można zrobić to samo zadanie z ... jednej linii kodu w metodzie:

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

lub podobnym expresión:

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

Dziękuję i twoje są oczywiście poprawne! Ale w tym przypadku chcę użyć raw sql, ponieważ później wykonam sprzężenia i nie chcę tworzyć encji dla tego w moim kodzie. – jakob

Powiązane problemy