ActiveJDBC模型的虚拟属性

Virtual attribute of ActiveJDBC model

我有一个名为 Job 的 ActiveJDBC 模型,并定义了一些静态属性,如 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 模型中读取虚拟属性 distance

我尝试在jobstable中添加distance列,报错ERROR: ORDER BY "distance" is ambiguous

不确定您所说的“虚拟”属性是什么意思,但 ActiveJDBC 模型只是 Java classes,因此您可以向其中添加任何您想要的内容。 JavaLite 不会为您处理它们。您有责任添加适当的 setter 和 getter 并保持它们的状态,就好像这是一个常规 Java class.

因此,您希望将其包装到模型中:

String sql = "select *, ST_distance(...) as distance from jobs... order by distance asc";
LazyList<Job> jobs = Base.findAll(sql);

你走在正确的道路上。请仔细阅读此方法的 Java文档:

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

特别关注这部分:“确保查询returns所有与该模型关联的列,以便生成的模型能够适当地自我水合。”。

您查询中的“*”处理第一部分,第二部分将被模型自动忽略但会参与选择:" 返回的列不属于此模型将被忽略,但可用于上述子句。"

所以,你所要做的就是写一个这样的方法:


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()) 中创建新模型,并在每个模型中分别注入“距离”属性。但是,我个人反对这一点,因为模型不是模型,因为模型映射到 table.