2012-12-10 29 views
5

我正在用Ebean構建Play2應用程序。我創建了一個服務類的方法通過ID列表獲取場館:如何在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; 
} 

但我發現了:

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

我已經通過閱讀http://www.avaje.org/ebean/introquery.html,但可能錯過了正確的語法。我想在原始SQL中執行此操作。 我錯過了什麼?

+0

只是好奇:'Venue'是一個模型,其表的名稱爲'Company'或您選擇用它畫線的其他模式? – biesior

+0

你好!我正在從一個新的應用程序訪問數據庫,其中場地是更適合實體的名稱。 – jakob

回答

3

您的請求似乎不正確。

什麼:

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

當然可以!謝謝! – jakob

3

你並不需要執行這種「複雜」查詢,這將是足夠好,如果你在你的Venue模型中使用常見Finder<I,T>(一次):

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

,那麼你可以做......在你的方法一行代碼相同的任務:

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

或類似expresion:

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

謝謝你,你當然是對的!但在這種情況下,我想使用原始的sql,因爲我稍後會執行連接,並且我不想在代碼中創建實體。 – jakob