用到許多數據庫關係化映射中間件,hibernate,jpa,iBATIS,最近研究nodejs,發現一款不可多得的orm開源工具sequelize,支持promise,映射配置/查詢/數據輸出等都是json格式,很是順心,官方文檔很標準但徹底說不透其強大的功能,不少都須要實際用到才能體會,就像json同樣變化無窮,你猜不透它有多少種變化。node
好,下面來看一個需求案例:
一條這樣的普通查詢語句:sql
select * from product join producton product.id=place.productid and place.city=1100 where product.price>100 limit 10
用sequelize的query來寫,若是寫成這樣:數據庫
models.product.findAll({ where: ["price>=?", 100 ], include: [{ model:models.product, where: { city:1100 } }], limit:12 })
實際上運行的sql是這個:json
select product.*, place.* from (select * from product where product.price>100 limit 10) join place on product.id=place.productid and place.city=1100
想要的結果是錯誤的,分頁時沒有把city:1100 條件限制了,結果有差別,那怎麼辦?promise
因而找方法,看到有人使用加subQuery:false條件來處理,以下:工具
models.product.findAll({ where: ["price>=?", 100 ], include: [{ model:models.product, where: { city:1100 } }], limit:10, subQuery:false //不讓在子查詢裏分頁,全局處理 })
這樣對於只含一個include關聯的查詢卻是問題不大,若是include多個對象,關聯的對象有1對多,多對多的關係,就很差控制了。ui
個人解決方法是,在須要一對一關聯的表中加入required:true,這樣就會將這個條件放在分頁以前執行,hibernate
models.product.findAll({ where: ["price>=?", 100 ], include: [{ model:models.product, where: { city:1100 }, required:true //inner join方式 }], limit:10, })
運行時sql以下:code
select product.*,place.* from product join place on product.id=place.productid and place.city=1100 where product.price>100 limit 10
required參數通常是指關聯對象是外聯仍是內聯,內聯required=true能夠表示內聯條件優先,分頁在後。
以上內容進僅供參考,使用場景不一樣,理解也不同。orm