sequelize關聯查詢時的分頁問題,join,limit

用到許多數據庫關係化映射中間件,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

相關文章
相關標籤/搜索