Sequelize with NodeJS kann Tabellen mit limit nicht verbinden

Ich versuche eine einfache Abfrage zu implementieren, die wie folgt aussehen sollte:

select * from property join entity_area on property.id=entity_area.entity_id and entity_area.area_id=1 where property.price>300000 limit 12 

Ziemlich einfach: Ich möchte das verbundene Ergebnis erhalten und dann auf 12 begrenzen.

In Sequelize verwende ich die folgende function:

 return models.property.findAll( { where: ["price>=?", 300000], include: [ { model:models.entity_area, where: { area_id:1 } } ], limit:12 }) 

Aber dieser Code generiert die folgende SQL:

 select property.*, entity_area.* from (select * from property where property.price>300000 limit 12) join entity_area on property.id=entity_area.entity_id and entity_area.area_id=1 

Das hat eine völlig andere Logik als das, was ich versuche zu tun, weil es im generierten sql zuerst 12 Ergebnisse erhält und dann versucht, sich mit entity_area zu verbinden, und natürlich stimmen die 12 randomen Ergebnisse nicht notwendigerweise mit dem entity_area überein. Ich bekomme keine Ergebnisse zurück.

Bitte schlage mir einen geeigneten path vor. Die propertiestabelle ist sehr massiv, und ich muss das "Limit" verwenden, anstatt alle Ergebnisse zu erhalten und sie in Javascript zu schneiden. Außerdem möchte ich nicht mit rohen Abfragen beginnen.

Solutions Collecting From Web of "Sequelize with NodeJS kann Tabellen mit limit nicht verbinden"

Eigentlich habe ich selbst eine Lösung gefunden. Ich denke, das ist ein Bug im Sequelize Framework.
In der file node_modules / sequelize / lib / dialect / abstract / query_generator.js gibt es eine function "selectQuery" mit der folgenden Zeile:

 subQuery = limit && (options.hasIncludeWhere || options.hasIncludeRequired || options.hasMultiAssociation) && options.subQuery !== false 

Zuallererst gibt es eine Option subQuery, die als false übergeben werden könnte, um die Unterabfragegenerierung zu entfernen. Sequelize Dokumentation hat kein Wort darüber. Aber wenn Sie subQuery: false im findAll -object übergeben, wird es nicht funktionieren, weil es aus irgendeinem Grund für die selectQuery-function nicht mehr ausreichend ist.
Ich habe versucht, etwas wie:

 return models.property.findAll( { where: ["price>=?", 300000], include: [ { model:models.entity_area, where: { area_id:1 } } ], limit:12, subQuery:false }) 

und habe immer noch optionsQuery = undefiniert.

Also musste ich die function in query_generator.js wie folgt ändern:

 subQuery = limit && (options.hasIncludeWhere || options.hasIncludeRequired || options.hasMultiAssociation) && options.subQuery !== false && options.doSubQuery===true 

Jetzt führt es diese hässliche Unterabfrage standardmäßig aus, es sei denn, ich spezifiziere explizit doSubQuery: true. Und schließlich habe ich die richtige Abfrage ohne Unterabfrage mit Limit bekommen.

 models.property.findAll( { where: [...], include: [{...}], limit:12 }, { subQuery:false }) 

Ich hatte dieses Problem kürzlich Sequelize 4.28.6, das ist, was für mich arbeitete

  User.findAll( { where: { $Tasks$: null, }, include: [ { model: Task, // required: false, }, ], limit: 3, subQuery: false, }) 

@ Yuriscom Antwort funktioniert immer noch, aber ich wollte nicht die Sequelize Codebase bearbeiten, da das Problem behoben wurde und subQuery: false, hinzufügen subQuery: false, funktioniert