簡體   English   中英

ActiveJDBC 的虛擬屬性 model

[英]Virtual attribute of ActiveJDBC model

我有一個名為Job的 ActiveJDBC model,並定義了一些 static 屬性,如titlesalaryworkplace等。

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:

http://javalite.github.io/2.4-j8/org/javalite/activejdbc/Model.html#findBySQL-java.lang.String-java.lang.Object...-

特別關注這部分:“確保查詢返回與此 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM