2015-05-27 54 views
2

我试图想出一个动态查询,并基于我所做的研究,看起来像我最好的选择是选择生成器,因为我想使用注释而不是XML。MyBatis选择生成器

我有两个参数;一个列表和一个对象,我想传递给此查询生成器方法。我可以使用没有问题的对象,但不能从方法访问列表。

这里是我的映射器接口:

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

这里是getProductByBrandByCategory方法是ProductProvider类:

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

基本上,我试图通过列表迭代添加和/或/ where语句基于列表中的元素。

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

在此先感谢。

回答

1

查看this question作为示例如何获取colection中的参数。从列举的问题

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速度脚本语言 生成动态SQL查询。

  • 您还可以使用基于XML的映射定义,他们的工作真的好为你的情况

引用offical documentation,部分“映射批注”

,Java注解不幸的是在有限的表现力和灵活性。尽管大量的勘察,设计和试验所花费的时间,最强大的MyBatis映射不能用注解

内置

从我的商业经验MyBatis的XML配置的作品真的很好(我们使用的MyBatis与Spring)。金额样板代码是最小的 - 只是查询和resultMaps。即使使用XML标签中的某些逻辑(如果,foreach等),XML语法也很容易阅读。基于注释的配置需要复杂的嵌套注释,即使对于最简单的映射也不需要。我们仍然有一些mapers的注释,但对于新代码,我更喜欢XML。

IntelliJ IDEA将映射器接口方法与XML SQL定义链接起来,因此导航非常简单。