hibernate executeSQLQuery 查询多个表怎么返回值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate executeSQLQuery 查询多个表怎么返回值相关的知识,希望对你有一定的参考价值。
返回的是 Query对象可以用下面来取值
List list=query.list(); 或者
Iterator itor=query.iterator();
还有一个:
Object o=query.uniqueResult();
uniqueResult
Object uniqueResult()
throws HibernateExceptionConvenience method to return a single instance that matches the query, or null if the query returns no results.
Returns:
the single result or null
Throws:
NonUniqueResultException - if there is more than one matching result
HibernateException 参考技术A hibernate executeSQLQuery 这个返回的是List<Object[]>类型
比较麻烦,劝你换其他查询吧
hql或者qbc都很好
返回实例导致“尝试引用已删除的函数”错误
【中文标题】返回实例导致“尝试引用已删除的函数”错误【英文标题】:Return instance causes 'attempting to reference a deleted function' error 【发布时间】:2016-12-07 01:25:23 【问题描述】:在过去一两年使用 C# 之后,我的 C++ 变得有点生疏了。
我正在编写一个数据库类,但以下方法有问题:
CRecordset CAccessDatabaseReader::ExecuteSqlQuery(LPCTSTR pszSqlQuery)
CRecordset recordSet(&m_Database);
recordSet.Open(CRecordset::forwardOnly, pszSqlQuery);
return CRecordset(recordSet);
编译器在return
语句的行上报错:
错误 C2280 'CRecordset::CRecordset(const CRecordset &)': 试图引用已删除的函数
有人能帮我准确理解这里发生了什么吗?
【问题讨论】:
CRecordSet 似乎是一个不可复制的类。它没有复制构造函数。 在 C++ 中,您可以关闭类的复制,这就是 CRecordset 所做的。这就是为什么不能按值返回的原因。 要像这样“返回”一个基于 CObject 的类,您可能必须使用动态分配。 【参考方案1】:CRecordset
的复制构造函数已显式标记为deleted
,以防止将CRecordset
对象从一个对象复制到另一个对象。
因此,函数必须通过指针返回一个新对象,并要求调用者在使用完对象后delete
:
CRecordset* CAccessDatabaseReader::ExecuteSqlQuery(LPCTSTR pszSqlQuery)
CRecordset *recordSet = new CRecordset(&m_Database);
if (!recordSet->Open(CRecordset::forwardOnly, pszSqlQuery))
delete recordSet;
return NULL; // or raise an exception
return recordSet;
CRecordset *rs = reader.ExecuteSqlQuery(TEXT("..."));
if (rs)
...
delete rs;
或者更好:
std::unique_ptr<CRecordset> CAccessDatabaseReader::ExecuteSqlQuery(LPCTSTR pszSqlQuery)
std::unique_ptr<CRecordset> recordSet(new CRecordset(&m_Database));
if (!recordSet->Open(CRecordset::forwardOnly, pszSqlQuery))
recordSet.reset(); // or raise an exception
return recordSet;
std::unique_ptr<CRecordset> rs = reader.ExecuteSqlQuery(TEXT("..."));
if (rs)
...
【讨论】:
请问返回std::unique_ptr<>
有什么意义?为什么不直接返回一个常规指针,然后让调用者将该指针分配给std::unique_ptr<>
类型的变量?这不是更简单吗?
如果调用者没有将原始指针分配给智能指针类?如果调用者忘记了指向delete
的指针,或者在调用delete
之前发生未捕获的异常,则调用者将面临内存泄漏的风险。该函数无法知道调用者将使用或不使用什么。所以最好明确说明预期的内存管理。使用智能指针的全部目的是避免这些问题。这也有助于函数本身自动管理内存,以防在调用 return
之前出现问题。【参考方案2】:
CRecordset
已删除其复制构造函数,因此无法按值返回。您可能会返回 std::unique_ptr<CRecordset>
或来自 ExecuteSqlQuery
的引用。
关于删除复制构造函数:https://***.com/a/6077164/2449857
关于从函数返回引用:Is the practice of returning a C++ reference variable, evil?
【讨论】:
这里没有“返回引用” @M.M 他说他正在编写CAccessDatabaseReader
类。所以他可以让ExecuteSqlQuery
返回CRecordset&
或const CRecordset&
,如果他做得对的话。
那是个坏主意。不过,该线程答案中的unique_ptr
示例可能很有用。以上是关于hibernate executeSQLQuery 查询多个表怎么返回值的主要内容,如果未能解决你的问题,请参考以下文章