[英]Virtual attribute of ActiveJDBC model
我有一個名為Job
的 ActiveJDBC model,並定義了一些 static 屬性,如title
、 salary
、 workplace
等。
public class Job extends Model {
public String getTitle() {
return getString("title");
}
public void setTitle(String title) {
setString("title", title);
}
public Integer getSalary() {
return getInteger("salary");
}
public void setSalary(Integer salary) {
setInteger("salary", salary);
}
public String getWorkplace() {
return getString("workplace");
}
public void setWorkplace(String workplace) {
setString("workplace", workplace);
}
}
現在我想根據 sql 以下的幾何距離找到工作:
String sql = "select *, ST_distance(...) as distance from jobs... order by distance asc";
LazyList<Job> jobs = Job.findBySql(sql);
如何從Job
model 讀取虛擬屬性distance
?
我試圖在jobs
表中添加distance
列,它報告錯誤ERROR: ORDER BY "distance" is ambiguous
不確定“虛擬”屬性是什么意思,但 ActiveJDBC 模型只是 Java 類,因此您可以向其中添加任何內容。 JavaLite 不會為您處理它們。 您有責任添加適當的 setter 和 getter 並維護它們的 state,就像這是一個常規的 Java class 一樣。
所以,你想把它包裝成一個 model:
String sql = "select *, ST_distance(...) as distance from jobs... order by distance asc";
LazyList<Job> jobs = Base.findAll(sql);
你是在正確的道路上。 請仔細閱讀此方法的 JavaDoc:
特別關注這部分:“確保查詢返回與此 model 關聯的所有列,以便生成的模型可以適當地自我補充。 ”。
查詢中的“*”處理第一部分,第二部分將自動被 model 忽略,但會參與選擇:“不屬於此 model 的返回列將被忽略,但可以使用對於像上面這樣的條款。 ”
所以,你所要做的就是寫一個這樣的方法:
public class Job{
public List<Map> getNearJobs(){
String sql = "select *, ST_distance(. ? . ? .) as distance from jobs... order by distance asc";
return Base.findAll(sql, getLogitude(), getLatitude());
}
}
這樣,您將構建一個查詢,該查詢將帶來(並排序)正確的地圖,並適當地填充它們的屬性。
因此,您將獲得一個地圖列表,而不是作業列表,但它將包含您需要的所有數據。 您可以將這種方法與一些代碼雜技結合使用,以從地圖列表 ( Model.fromMap()
) 中創建新模型,並在每個 model 中單獨注入“距離”屬性。但是,我個人反對這種做法,因為那樣的話 model 是不是 model,因為 model 正在映射到表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.