2

我正在尝试提出一个动态查询,根据我所做的研究,看起来我最好的选择是选择构建器,因为我想使用注释而不是 XML。

我有两个参数;我要传递给此查询构建器方法的列表和对象。我可以毫无问题地使用该对象,但无法从该方法访问列表。

这是我的映射器界面:

@SelectProvider(type = ProductProvider.class, method = "getProductByBrandByCategory")
List<Product> getProductListByBrandByCategory(@Param("brandList") List<Brand> brandList, @Param("category") Category category);

这是 ProductProvider 类的 getProductByBrandByCategory 方法:

public String getProductByBrandByCategory(Map params) {
    return new SQL() {{
        SELECT("*");
        FROM("product");
        WHERE("category_id = #{category.id}");
    }}.toString();
}

基本上,我正在尝试遍历列表以根据列表中的元素添加和/或/where 语句。

有没有办法可以访问brandList 元素?我的猜测是它是 Maps 参数的一部分,但不知道如何访问它。

提前致谢。

4

1 回答 1

1

有关如何获取集合中参数的示例,请参阅此问题。引用问题的代码示例

public class CategoryDaoSelectProvider {
public static String findByParentIdAndName(Map<String, Object> params) {
    Long parentId = (Long)params.get("parentId");  // WHY IS THIS HERE???

    StringBuffer buffer = new StringBuffer();
    buffer.append("SELECT COUNT(id) FROM Category ");

    if (parentId == null) {
        buffer.append("WHERE parentId IS NULL ");
    } else {
        buffer.append("WHERE parentId = #{parentId} ");
    }

    buffer.append("AND LOWER(name) = LOWER(#{name}) ");

    return buffer.toString();
}

}

其他解决方案是

  • 您可以使用MyBatis Velocity来使用 Apache Velocity 脚本语言来生成动态 SQL 查询。

  • 您还可以使用基于 XML 的映射器定义,它们非常适合您的情况

引用官方文档,“映射器注释”部分

不幸的是,Java 注释的表达能力和灵活性受到限制。尽管在调查、设计和试验上花费了大量时间,但最强大的 MyBatis 映射根本无法使用 Annotations 构建

根据我的商业经验,myBatis XML 配置工作得非常好(我们将 myBatis 与 Spring 一起使用)。数量样板代码是最少的——只是查询和结果映射。XML 语法很容易阅读,即使在 XML 标记中有一些逻辑(if、foreach 等)。即使对于最简单的映射,基于注释的配置也需要复杂的嵌套注释,这对我来说并不好。我们仍然有一些映射器的注释,但对于新代码,我更喜欢 XML。

IntelliJ IDEA 将映射器接口方法与 XML SQL 定义联系起来,因此导航很容易。

于 2015-05-27T18:51:44.453 回答