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&lt;&gt;有什么意义?为什么不直接返回一个常规指针,然后让调用者将该指针分配给std::unique_ptr&lt;&gt; 类型的变量?这不是更简单吗? 如果调用者没有将原始指针分配给智能指针类?如果调用者忘记了指向delete 的指针,或者在调用delete 之前发生未捕获的异常,则调用者将面临内存泄漏的风险。该函数无法知道调用者将使用或不使用什么。所以最好明确说明预期的内存管理。使用智能指针的全部目的是避免这些问题。这也有助于函数本身自动管理内存,以防在调用 return 之前出现问题。【参考方案2】:

CRecordset 已删除其复制构造函数,因此无法按值返回。您可能会返回 std::unique_ptr&lt;CRecordset&gt; 或来自 ExecuteSqlQuery 的引用。

关于删除复制构造函数:https://***.com/a/6077164/2449857

关于从函数返回引用:Is the practice of returning a C++ reference variable, evil?

【讨论】:

这里没有“返回引用” @M.M 他说他正在编写CAccessDatabaseReader 类。所以他可以让ExecuteSqlQuery返回CRecordset&amp;const CRecordset&amp;,如果他做得对的话。 那是个坏主意。不过,该线程答案中的unique_ptr 示例可能很有用。

以上是关于hibernate executeSQLQuery 查询多个表怎么返回值的主要内容,如果未能解决你的问题,请参考以下文章

hibernate问题

Spring和Hibernate的注解整合 hibernate3和hibernate4/5的区别

hibernate.merge()方法怎么用

hibernate 异常 怎么解决

Hibernate之Hibernate环境配置

(转)Hibernate框架基础——Hibernate API及Hibernate主配置文件