c++ - ORM 获取连接表行数

标签 c++ orm wt

我目前在一个项目中将 Witty 和 DBO 与 SQLite3 结合使用,现在我需要加入一个相关表以仅获取行数。

表格

CREATE TABLE "rfnode" (
  "mac" varchar(16) not null,
  "zone" integer not null,
  "subZone" integer not null,
  "unit" text not null,
  "pwm" integer not null,
  "led" integer not null,
  "network" integer not null,
  "lastContact" text,
  "ioConfiguration" integer not null,
  primary key ("mac")
)

CREATE TABLE "nodemeasure" (
  "id" integer primary key autoincrement,
  "mac" text not null,
  "type" integer not null,
  "date" text,
  "batchDate" text,
  "value" real not null
)

通常 SQL 查询是:

SELECT
    rn.*,
    COUNT(nm.id) AS measuresCount
FROM rfnode rn
LEFT JOIN nodemeasure nm
    ON nm.mac = rn.mac
GROUP BY rn.mac

现在的问题是我不知道如何使用 Wt/DBO 库查询和获取结果。

第一次尝试

class RFNode
{
    public:
        std::string mac, unit;
        int zone = 0, subZone = 0, pwm = 0, led = 0, network = 0, ioConfiguration = 0, measuresCount = 0;
        Wt::WDateTime lastContact;

        RFNode()
        {
            mac             = "";
            zone            = 0;
            subZone         = 0;
            unit            = "";
            pwm             = 8;
            led             = 8;
            network         = 0;
            ioConfiguration = 0;
            measuresCount   = 0;
        }

        RFNode(std::string p_sMAC, int p_nZone, int p_nSubZone, std::string p_sUnit, int p_nPWM, int p_nLED, int p_nNetwork, Wt::WDateTime p_oLastContact, int p_nIOConfiguration, int p_nMeasuresCount = 0)
        {
            mac             = p_sMAC;
            zone            = p_nZone;
            subZone         = p_nSubZone;
            unit            = p_sUnit;
            pwm             = p_nPWM;
            led             = p_nLED;
            network         = p_nNetwork;
            lastContact     = p_oLastContact;
            ioConfiguration = p_nIOConfiguration;
            measuresCount   = p_nMeasuresCount;
        }

        template<class Action>
        void persist(Action& a)
        {
            dbo::id(a,      mac,            "mac",16);
            dbo::field(a,   zone,           "zone");
            dbo::field(a,   subZone,        "subZone");
            dbo::field(a,   unit,           "unit");
            dbo::field(a,   pwm,            "pwm");
            dbo::field(a,   led,            "led");
            dbo::field(a,   network,        "network");
            dbo::field(a,   lastContact,    "lastContact");
            dbo::field(a,   ioConfiguration,"ioConfiguration");
            dbo::field(a,   measuresCount,  "measuresCount");
        };
};

查询:

Wt::Dbo::collection<Wt::Dbo::ptr<RFNode>> lTemp = m_oSession.query<Wt::Dbo::ptr<RFNode>>("SELECT rn.*, COUNT(nm.id) AS measuresCount FROM rfnode rn LEFT JOIN nodemeasure nm ON nm.mac = rn.mac").resultList();

导致 Session::query(): too many aliases for result

第二次尝试

使用相同的类 RFNode,除了字段 measuresCount 被移除。

typedef Wt::Dbo::ptr_tuple<RFNode, int>::type RFNodeJoin;
        typedef Wt::Dbo::collection<RFNodeJoin> RFNodeJoinC;

        RFNodeJoinC lTemp = m_oSession.query<RFNodeJoin>("SELECT rn.*, COUNT(nm.id) AS measuresCount FROM rfnode rn LEFT JOIN nodemeasure nm ON nm.mac = rn.mac GROUP BY rn.mac").resultList();

        std::vector<RFNodeJoin> lTransition(lTemp.begin(),lTemp.end());

但它没有编译,导致错误:错误:请求成员“obj”中的“persist”,它是非类类型“int”。我想我需要为每个表映射一个类,但由于我想要一个计数并且没有现有字段,我认为 int 类无法完成这项工作。

最佳答案

最后通过反复试验我找到了解决方案...

首先,RFNode 类不再有字段 measuresCount

请求和迭代如下:

Wt::Dbo::collection<boost::tuple<Wt::Dbo::ptr<RFNode>, int>> lTemp = m_oSession.query<boost::tuple<Wt::Dbo::ptr<RFNode>, int>>("SELECT rn, COUNT(nm.id) FROM rfnode rn LEFT JOIN nodemeasure nm ON nm.mac = rn.mac GROUP BY rn.mac").resultList();

for(Wt::Dbo::collection<boost::tuple<Wt::Dbo::ptr<RFNode>, int>>::const_iterator i = lTemp.begin();i != lTemp.end();++i)
{
    Wt::Dbo::ptr<RFNode> pRFNode;
    int nNodeMeasureCount;

    boost::tie(pRFNode,nNodeMeasureCount) = *i;

    lNodes.push_back(
            RFNode(
                    pRFNode->mac,
                    pRFNode->zone,
                    pRFNode->subZone,
                    pRFNode->unit,
                    pRFNode->pwm,
                    pRFNode->led,
                    pRFNode->network,
                    pRFNode->lastContact,
                    pRFNode->ioConfiguration,
                    nNodeMeasureCount
            )
    );
}

希望有一天它能对某人有所帮助!

关于c++ - ORM 获取连接表行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34276515/

相关文章:

c++ - 并行化深度优先搜索 C++

c++ - Wt C++ root() 返回 Null

c++ - (boost::&& std::) 绑定(bind)仅在参数太少的 MSVC 上失败

从 Wt 示例错误编译 simpleChat.C

c++ - 以固定数量将数据写入文件导致它重复文件c++中的数据

c++ - 从匹配返回值类型的映射中返回值

c++ - Qt Creator 中的 Visual Studio 解决方案

python - Django ORM 无法为不在其中的多对多生成正确的 SQL

php - Symfony/查询生成器 : "myEntityAlias.myEntity.id" <- possible?

java - 如何加速一对多关联的 Hibernate DML 语句