1#ifndef NEFORCE_DATABASE_REPOSITORY_HPP__
2#define NEFORCE_DATABASE_REPOSITORY_HPP__
30NEFORCE_BEGIN_NAMESPACE__
46template <
typename T,
typename Connect =
idb_tb_connect>
55 static string build_insert_with_values(
const T& entity) {
63 for (
const auto& entry: meta->all_properties()) {
64 const auto* prop = entry.second;
65 if (prop->is_transient() || prop->is_auto_increment()) {
81 static string build_update_with_values(
const T& entity) {
86 for (
const auto& entry: meta->all_properties()) {
87 if (entry.second->is_primary_key()) {
93 NEFORCE_THROW_EXCEPTION(
value_exception(
"repository::update: no primary key defined"));
99 for (
const auto& entry: meta->all_properties()) {
100 const auto* prop = entry.second;
101 if (prop->is_transient() || prop->is_primary_key() || prop->is_auto_increment()) {
116 static string build_delete_with_pk(
const T& entity) {
122 for (
const auto& entry: meta->all_properties()) {
123 if (entry.second->is_primary_key()) {
129 NEFORCE_THROW_EXCEPTION(
value_exception(
"repository::remove: no primary key defined"));
150 NEFORCE_NODISCARD Connect&
connection() noexcept {
return conn_; }
159 return conn_.update(sql);
169 return conn_.update(sql);
182 for (
const auto& entry: meta->all_properties()) {
183 if (entry.second->is_primary_key()) {
193 for (
const auto& entry: meta->all_properties()) {
194 if (entry.second->is_transient()) {
197 b.
select(entry.second->name());
202 auto result = conn_.query(b.
build());
203 if (result ==
nullptr || result->empty()) {
207 if (!result->next()) {
223 for (
const auto& entry: meta->all_properties()) {
224 if (entry.second->is_transient()) {
227 b.
select(entry.second->name());
231 auto result = conn_.query(b.
build());
245 for (
const auto& entry: meta->all_properties()) {
246 if (entry.second->is_transient()) {
249 b.
select(entry.second->name());
252 b.
where(where_clause);
254 auto result = conn_.query(b.
build());
270 for (
const auto& entry: meta->all_properties()) {
271 if (entry.second->is_transient()) {
274 b.
select(entry.second->name());
278 if (!order_by.empty()) {
282 b.
page(
static_cast<int>(page_num),
static_cast<int>(page_size));
284 auto result = conn_.query(b.
build());
297 const string sql = build_insert_with_values(entity);
298 return conn_.update(sql);
307 const string sql = build_update_with_values(entity);
308 return conn_.update(sql);
317 const string sql = build_delete_with_pk(entity);
318 return conn_.update(sql);
331 auto result = conn_.query(b.
build());
332 if (result ==
nullptr || result->empty()) {
335 if (!result->next()) {
338 return static_cast<size_t>(result->get_int64(0));
350NEFORCE_END_NAMESPACE__
static registry & instance()
获取单例实例
unique_ptr< T > find_by_id(const reflect::meta_any &id)
按主键查找实体
bool table_exists()
检查表是否存在
bool insert(T &entity)
插入实体
vector< T > find_where(const string &where_clause)
按 WHERE 条件查询实体
vector< T > find_page(const size_t page_num, const size_t page_size, string_view order_by="")
分页查询实体
bool remove(const T &entity)
删除实体(按主键)
repository(Connect &conn) noexcept
构造函数
bool create_table(string_view table_override="")
创建数据库表
vector< T > find_all()
查询全部实体
bool drop_table(string_view table_override="")
删除数据库表
bool update(const T &entity)
更新实体(按主键)
Connect & connection() noexcept
获取内部连接引用
sql_builder & where_eq(string field, string value)
添加相等条件
sql_builder & from(string table) noexcept
设置主表
sql_builder & order_by_asc(string field)
添加升序排序
sql_builder & select_count(string field, string alias)
添加COUNT聚合函数(带别名)
sql_builder & page(int page_num, int page_size)
添加分页
sql_builder & values(vector< string > values)
设置VALUES占位符
sql_builder & where(string condition)
添加WHERE条件
string build() const
构建最终的SQL语句
sql_builder & select(vector< string > fields)
列表设置SELECT字段
sql_builder & update(string table)
设置UPDATE表名
sql_builder & delete_from(string table)
设置DELETE FROM表名
sql_builder & insert_into(string table, vector< string > fields)
设置INSERT INTO表名和字段
sql_builder & set(string assignment)
添加SET赋值
static string create_table_sql(string_view table_override="")
生成 CREATE TABLE SQL
static T from_row(const idb_tb_result &row, const unordered_map< string, size_t > &col_map={})
从结果行构建实体对象
static reflect::meta_any get_pk_value(const T &entity)
获取主键值
static vector< T > from_result(unique_ptr< idb_tb_result > result)
从查询结果集构建实体对象列表
static string drop_table_sql(string_view table_override="")
生成 DROP TABLE SQL
static string table_name()
获取映射的表名
constexpr void push_back(const T &value)
在末尾拷贝插入元素
constexpr bool is_base_of_v
is_base_of的便捷变量模板
constexpr type_id type_id_for() noexcept
计算类型 T 的运行时期类型标识
string meta_any_to_sql_literal(const reflect::meta_any &val)
将 meta_any 值转换为 SQL 字面量字符串
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
constexpr unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr