我有一个搜索表单,需要包含两个不同表格的结果。这些表彼此没有关系,我们是分开的。在我的示例场景中,我们有加油站和杂货店。杂货店表可能具有freezerSize,produceStorage,numberOfCarts等属性。加油站表可能有gasTankSizeInGallons,windowCleanerInGallons等....两个表之间有一些共享字段(即 - numberOfEmployees,squareFeetOfStoreSpace,numberOfShelves等...)。
我的搜索查询需要一起排序和显示加油站和杂货店。我正在考虑使用SQL联合并将不适用的字段设置为0或null。但是,我真的很难知道如何使用ibatis(因为两个对象的类型不同):
<select id="searchQuery" parameterClass="java.util.Map" resultClass="????????????????">
SELECT
storeName, storeCity, storeState, numberOfCarts, freezerSize, 0 gasTankSizeInGallons, 0 windowCleanerInGallons
FROM
grocery_stores
UNION
SELECT
storeName, storeCity, storeState, 0 numberOfCarts, 0 freezerSize, gasTankSizeInGallons, windowCleanerInGallons
FROM
gas_stations
ORDER BY storeState, storeCity, storeName
</select>
注意 - 实际查询在顺序中有更多的东西,它是分页的,并且select中还有更多的字段(加上select字段中每个适用字段的where子句)。
上述查询的resultClass应该是什么?我有一个GroceryStore和GasStation类,它们都来自Store。但是,Store没有很多GroceryStore和GasStation特定字段。我可以做两个单独的查询,但结果的排序必须在java中完成,因为它需要首先加载大量数据,所以效率很低。
由于
答案 0 :(得分:1)
经过大量的谷歌搜索,我找到了自己问题的答案。
ibatis鉴别器将在gasStation和groceryStore类之间进行选择。
<resultMap id="searchResultMap" class="Store">
<discriminator column="storeType" javaType="java.lang.String">
<subMap value="grocery" resultMap="groceryStoreMap"/>
<subMap value="gasStation" resultMap="gasStationMap"/>
</discriminator>
</resultMap>
然后我会编辑我的查询以在选择字段中添加storeType并为groceryStore和gasStation创建resultMap。
注意 - 为了解决这个问题,我读了this stackoverflow question。