一、问题
前面介绍的一个表只有一个主键,若表中多个列构成主键,如何实现?
二、具体实现
注意:环境搭建参见 二、QxOrm之增删改查
CompositeClass.h
#ifndef COMPOSITECLASS_H
#define COMPOSITECLASS_H
#include "precompiled.h"
#include <QSharedPointer>
class CompositeClass
{
public:
//两个联合主键
typedef QPair<QString, QString> TypeCompositeKey;
//三个联合主键
// typedef std::tuple<QString, QString, QString> TupleCompositeKey;
//访问 std::tuple
// std::get<0>(id)
TypeCompositeKey id;
QString name;
public:
CompositeClass();
virtual ~CompositeClass();
//获取联合主键
TypeCompositeKey getId() const;
//获取主键1
QString getId0() const;
//获取主键2
QString getId1() const;
//设置主键1
void setId0(QString &s);
//设置主键2
void setId1(QString &s);
};
QX_REGISTER_PRIMARY_KEY(CompositeClass, CompositeClass::TypeCompositeKey)
QX_REGISTER_HPP_QX_BLOG(CompositeClass, qx::trait::no_base_class_defined, 0)
typedef QSharedPointer<CompositeClass> CompositePtr;
typedef QList<CompositePtr> ListComposite;
#endif // COMPOSITECLASS_H
CompositeClass.cpp
#include "compositeclass.h"
#include <QxOrm_Impl.h>
QX_REGISTER_CPP_QX_BLOG(CompositeClass)
namespace qx {
template <> void register_class(QxClass<CompositeClass> & t) {
//联合主键(id,flag两列一起作为主键)
t.id(& CompositeClass::id, "id|flag");
t.data(& CompositeClass::name, "name");
}
}
CompositeClass::CompositeClass()
{
}
CompositeClass::~CompositeClass()
{
}
CompositeClass::TypeCompositeKey CompositeClass::getId() const
{
return id;
}
QString CompositeClass::getId0() const
{
return id.first;
}
QString CompositeClass::getId1() const
{
return id.second;
}
void CompositeClass::setId0(QString &s)
{
id.first = s;
}
void CompositeClass::setId1(QString &s)
{
id.second = s;
}
三、测试使用
#include "precompiled.h"
/*
* QxOrm_Impl.h,它的作用是检测内存泄露。如果使用 QxMemLeak 模块或 boost::serialization 引擎,
* 应该在所有的 *.cpp 中包含它;否则,它便是可选的(非必须)
*/
#include "QxOrm_Impl.h"
#include "compositeclass.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/*==================================连接 MySql 数据库=================================*/
qx::QxSqlDatabase::getSingleton()->setDriverName("QMYSQL");
qx::QxSqlDatabase::getSingleton()->setDatabaseName("test");
qx::QxSqlDatabase::getSingleton()->setHostName("127.0.0.1");
qx::QxSqlDatabase::getSingleton()->setUserName("root");
qx::QxSqlDatabase::getSingleton()->setPassword("root");
qx::QxSqlDatabase::getSingleton()->setPort(3306);
//在打印日志之前,格式化 sql 语句
qx::QxSqlDatabase::getSingleton()->setFormatSqlQueryBeforeLogging(true);
//显示执行时间
qx::QxSqlDatabase::getSingleton()->setDisplayTimerDetails(true);
//只是为了调试:若检测到取得的关系中无效的 offset ,断言中断
qx::QxSqlDatabase::getSingleton()->setVerifyOffsetRelation(true);
//创建表
QSqlError daoError = qx::dao::create_table<CompositeClass>();
qAssert(!daoError.isValid());
return a.exec();
}