2012-12-10 24 views
5

Tôi đang xây dựng ứng dụng Play2 với Ebean. Tôi đã tạo ra một lớp dịch vụ với một phương pháp để có được địa điểm của một danh sách các id:Làm cách nào để chọn danh sách với 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; 
} 

Nhưng tôi nhận được:

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

Tôi đã đọc qua http://www.avaje.org/ebean/introquery.html nhưng có lẽ bỏ lỡ cú pháp chính xác. Tôi muốn làm điều này trong sql nguyên. Tôi đã bỏ lỡ điều gì?

+0

Chỉ cần tò mò: 'Địa điểm' là mô hình có tên bảng là' Công ty' hoặc bạn đang chọn với đối tượng của mô hình khác? – biesior

+0

Xin chào! Tôi đang truy cập cơ sở dữ liệu từ một ứng dụng mới nơi địa điểm là tên phù hợp hơn cho thực thể. – jakob

Trả lời

3

Yêu cầu của bạn có vẻ không chính xác.

gì về:

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

Có tất nhiên! Cảm ơn bạn! – jakob

3

Bạn không cần phải thực hiện như truy vấn 'sành điệu', nó sẽ đủ tốt nếu bạn sẽ sử dụng phổ biến trong mô hình Finder<I,T>Venue của bạn (một lần):

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

Vì vậy, sau đó bạn có thể làm cùng một công việc với ... dòng mã trong phương pháp của bạn:

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

hoặc có ngoại lệ tương tự:

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

Cảm ơn bạn và tất nhiên là bạn đúng! Nhưng trong trường hợp này tôi muốn sử dụng sql thô kể từ khi tôi sẽ thực hiện tham gia sau này và tôi không muốn tạo ra các thực thể cho rằng trong mã của tôi. – jakob

Các vấn đề liên quan