2012-12-10 15 views
5

ile listeden nasıl seçim yaparım Ebean ile bir Play2 uygulaması yapıyorum. Ben kimlikleri listesi tarafından mekanları almak için bir yöntem ile bir hizmet sınıfı oluşturduk: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; 
} 

Ama alıyorum: Ben http://www.avaje.org/ebean/introquery.html okumak ama muhtemelen doğru sözdizimi kaçırmış

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

. Bunu ham sql'de yapmak istiyorum. Neleri özledim?

+0

Meraktan diğer modelin nesneleri ile 'Venue' tablonun adıdır bir modeldir' Company' veya seçiyoruz? – biesior

+0

Merhaba! Veritabanına varlık için daha uygun bir ad olan yeni bir uygulamadan erişiyorum. – jakob

cevap

3

Talebiniz doğru görünüyor.

Ne hakkında: Eğer (bir kez) sizin Venue modelinde ortak Finder<I,T> kullanacağız eğer

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

Evet tabiki! Teşekkür ederim! – jakob

3

Sen yeterince iyi olacak böyle 'sofistike' sorgusu yapmak gerekmez:

public static List<Venue> getVenuesForIds(List<Long> ids){   
    return Venue.find.select("id,name").where().idIn(ids).findList(); 
} 
:
@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); 
} 

Öyleyse yapın ... yönteminde kod tek bir satır aynı görevi yapabilir

veya benzer anlatımda ile:

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

Teşekkürler ve elbette doğrudur! Ancak bu durumda, daha sonra katılmaları yapacağım ve kodlarım için varlıkları oluşturmak istemediğim için raw sql kullanmak istiyorum. – jakob