系统有三张表,文章,标签及关系表。如何通过标签进行并集,交集与非集的查询,本来想找一些开源的框架来完成,后来发现可以用sql搞定的话,就懒得优化了。配置如下:
ComplexQuery包含三个属性,List<Long> andTagIds; List<Long> orTagIds; List<Long> notTagIds;
<select id="listArticleIdsByQuery" resultClass="java.lang.Long" parameterClass="ComplexQuery">
select distinct(article_id) from article_tag_relation where 1 = 1
<dynamic>
<isNotEmpty prepend="and" property="andTagIds">
<iterate conjunction="and" property="andTagIds">
article_id in (select distinct(article_id) from article_tag_relation where tag_id = #andTagIds[]#)
</iterate>
</isNotEmpty>
<isNotEmpty prepend="and" property="notTagIds">
<iterate conjunction="and" property="notTagIds">
article_id not in (select distinct(article_id) from article_tag_relation where tag_id = #notTagIds[]#)
</iterate>
</isNotEmpty>
<isNotEmpty prepend="and" property="orTagIds">
<iterate conjunction="," open="tag_id in (" close=")" property="orTagIds">
#orTagIds[]#
</iterate>
</isNotEmpty>
</dynamic>
limit #startRow#,#pageSize#
</select>