ActiveJDBC:将范围与动态参数一起使用

时间:2018-09-24 15:07:34

标签: activejdbc javalite

实际的scope examples提供了传递给查询的硬编码参数的使用:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
cell.widthConstraint.constant = UIScreen.main.bounds.width / 3

是否可以使该参数动态化,并使其范围如下:

DriverManager.getConnection("jdbc:mysql://localhost:3306/login?serverTimezone=UTC","root","Password");

使用示例:

public class Employee extends Model {
    static {
        addScope("byDepartment", "department = 'marketing'");
    }
}

谢谢。

2 个答案:

答案 0 :(得分:1)

当前实现仅适用于硬编码范围。通常,具有动态作用域与在where()方法中仅具有一个附加参数没有什么不同,但是会使实现复杂化。

这个问题促使人们进行一些哲学上的讨论。通常,您会将模型用作其自身的服务。换句话说,从模型外部使用这样的模型不是首选方法:

List<Employee> employees = Employee.scope("byDepartment").where("start_date > ?", startDate);

最好将对EMPLOYEES表的所有访问权包装到Employee类中,如下所示:

public class Employee extends Model{
   public static List<Employee> getStartedByDepartment(Date started, String department){
          return Employee.scope(department).where("start_date > ?", started);
  } 
}

我们使用这种模式对所有JavaLite项目进行编码,并且不允许ActiveJDBC API泄漏外部模型(大部分情况下,哈哈)。

如您所见,范围很少给您提供,因为模型的内部实现可以使用也可以不使用范围,您将获得相同的结果。这种编码模式要好得多,因为:

  1. 您在可以测试的模型上有静态方法
  2. 您有可能具有guard statements if (department = null) throw new IllegalArgumentException("blah...")
  3. 的静态方法
  4. 您对具有良好语义名称的模型使用静态方法
  5. 表的实现和访问权包装在一个类中,而不是在外部(控制器)放血。
  6. 易于进行重构。

但是,如果使用这种方法,则范围的值接近零。

不用说,我在工作中不使用范围。

答案 1 :(得分:0)

在像在Employee模型中那样使参数动态化时,我没有看到任何错误:

<img id="side1" onclick="side(0)" src="img1.jpeg">
<img id="side2" onclick="side(1)" src="img2.jpeg">
<img id="side3" onclick="side(2)" src="img3.jpeg">
<img id="side4" onclick="side(3)" src="img4.jpeg">

问题实际上出在

var sideimg = document.querySelectorAll('#side-img img');
var main = document.querySelector('#main');

function side(index) {
    main.src = sideimg[index].src;
}

在scopeName旁边,public class Employee extends Model { static { addScope("byDepartment", "department = '?'"); } } 无法为scopeValue提供额外的参数。

相反,您可以致电Employee.scope("byDepartment").where(....)

其中scope()是您的scopeQuery,您可以使用Employee.where(subquery, params)访问,而subquery是您的scopeValue。