2011-07-29 18 views
5

Tôi nhận được một "play.exceptions.JavaExecutionException: ColumnNotFound (comments.id)" trong một đoạn mã sau khi cố gắng di chuyển sang MySql thay vì memorydb. Hỗ trợ Postgres bởi Magic là gần như không có. Sự phát triển:ColumnNotFound vấn đề với Magic trong play scala

create table comments ( 
    id bigint(20) NOT NULL AUTO_INCREMENT, 
    source varchar(255) NOT NULL, 
    target varchar(255) NOT NULL, 
    content text NOT NULL, 
    date bigint NOT NULL, 
    PRIMARY KEY (id) 
); 

Mô hình:

case class comments(id: Pk[Long], source: String, target: String, 
content: String, date: Long) { 
    override def toString = "|%s| |%s|, |%s|, |%s|".format(id.toString, 
source, target, content) 
    lazy val formattedDate = new SimpleDateFormat("dd.MM.yyyy HH:mm") 
format date 
} 

object comments extends Magic[comments] 

Và đoạn mã:

def loadComments(username: String) = SQL("""select c.*, u.* from 
comments c, usr u where c.source = u.ccall and c.target = {ccall} 
order by c.date desc""").on("ccall" -> username).as(comments ~< usr *) 

bất cứ ai có thể cho tôi một số gợi ý? Tôi thực sự bị mắc kẹt trên đây .. Đây là stacktrace:

play.exceptions.JavaExecutionException: ColumnNotFound(comments.id) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:228) 
    at Invocation.HTTP Request(Play!) 
Caused by: java.lang.RuntimeException: ColumnNotFound(comments.id) 
    at scala.Predef$.error(Predef.scala:58) 
    at play.db.anorm.Sql$.as(Anorm.scala:984) 
    at play.db.anorm.Sql$class.as(Anorm.scala:919) 
    at play.db.anorm.SimpleSql.as(Anorm.scala:829) 
    at controllers.Profile$.loadacomments(Profile.scala:21) 
    at controllers.Profile$.loadacommentsWithLikes(Profile.scala:46) 
    at controllers.Profile$.comment(Profile.scala:91) 
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:543) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:499) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:493) 
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:470) 
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:158) 

Cảm ơn bạn!

+0

Cùng một vấn đề ở đây, sử dụng cài đặt H2 mặc định. – matthieus

Trả lời

0

Tôi giả định rằng thuật toán nhận xét hoạt động cho các truy vấn tầm thường? Bạn đã cố gắng không bí danh bảng?

Nếu điều đó không thành công, tôi có một giải pháp khá đáng sợ đối với nó. Đó là cách tôi đang sử dụng Anorm với Postgres. Tôi phải chỉnh sửa mã nguồn Anorm để chỉ tìm tên cột < > và không phải là < tên bảng >. < tên cột >. Nhưng điều đó mang lại một vấn đề mà Anorm không thể xác định cột nào là một JOIN. Vì vậy, tôi đã phải nghỉ mát để đặt tên cho tất cả các cột của tôi duy nhất.

Ngoài ra, bạn có thể thử kéo mã play-scala mới nhất từ ​​github, nhưng tôi không biết nếu có bất kỳ tiến bộ đáng kể nào về vấn đề này.

2

Trong trường hợp cụ thể này, trình điều khiển mysql là một trình điều khiển cũ làm cho tên trông thực sự lạ. Tôi vừa cập nhật trình điều khiển và mọi thứ đã trở lại vị trí.

Bạn có thể kiểm tra các chủ đề trong google nhóm ở đây: http://groups.google.com/group/play-framework/browse_thread/thread/3bd8d3ccb5a51d10/e7074ad34ac637da?lnk=gst&q=Jos%C3%A9+Leal#e7074ad34ac637da

+1

cảm ơn rất nhiều vì đã theo dõi điều này. Không thực sự giúp đỡ trường hợp của tôi không may (+1 mặc dù), tôi nghĩ rằng tôi sẽ phải đào một chút. – matthieus

+0

Một thứ khác khiến công việc thay vì sử dụng bí danh cho các bảng của bạn, chẳng hạn như "từ người dùng a.name = 'asd'", sử dụng tên đầy đủ từ bảng. Vì vậy: "từ người dùng trong đó users.name = 'asd'". Đó là làm việc cho tôi. Dù sao, đăng bài trong nhóm, tôi chắc chắn họ sẽ có một giải pháp cho bạn –

+0

ok, tìm thấy vấn đề của tôi và vấn đề là một chút lớn hơn (và ngu ngốc) hơn chỉ là cột không được tìm thấy. Trong trường hợp của tôi đó là yêu cầu SQL multiline của tôi gây ra vấn đề. Việc phân tích chuỗi SQL không thay thế "\ r" bằng "", vì vậy chỉ có dòng đầu tiên của SQL được thực hiện. Lưu ý rằng người dùng Windows: chỉ "\ n" đang được thay thế trong Anorm, không phải là "\ r". – matthieus

0

Không chắc, nhưng tôi đã nhìn thấy nó ở đâu khi bạn truy vấn nhiều bảng với Table1. , Bảng 2. và BOTH có một cột có cùng tên ... chẳng hạn như "ID", sau đó chúng được trả lại là

ID_A, ID_B, v.v ... rồi đến các cột khác. Vì vậy, nếu bảng USR của bạn có một cột được gọi là "ID" cũng có, thì đây có thể là những gì bạn đang chạy vào.

Nếu vậy, bạn có thể liệt kê một cách rõ ràng tất cả các cột từ bảng USR và KHÔNG bao gồm cột ID của bảng mà ...

HOẶC

thêm một cột để truy vấn của bạn

chọn C .ID dưới dạng MyCTableID, C. , U. ...

Sau đó, bạn BIẾT rõ ràng bạn sẽ có một cột được gọi là "MyCTableID" để chạy cùng.

+0

cảm ơn cho đoán của bạn, nhưng trong trường hợp của tôi nó có vẻ là một trường hợp khác nhau: truy vấn tham gia trả về chỉ các trường từ bảng đầu tiên (tôi thu hẹp vấn đề một chút) – matthieus

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