ActiveJDBC模型的虚拟属性
Virtual attribute of ActiveJDBC model
我有一个名为 Job
的 ActiveJDBC 模型,并定义了一些静态属性,如 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
模型中读取虚拟属性 distance
?
我尝试在jobs
table中添加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文档:
特别关注这部分:“确保查询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.
我有一个名为 Job
的 ActiveJDBC 模型,并定义了一些静态属性,如 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
模型中读取虚拟属性 distance
?
我尝试在jobs
table中添加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文档:
特别关注这部分:“确保查询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.