本机查询 - 如何仅从数据库中检索实体的特定列

Posted

技术标签:

【中文标题】本机查询 - 如何仅从数据库中检索实体的特定列【英文标题】:Native query - how retrive only specific colums from DB for Entity 【发布时间】:2017-05-17 10:00:35 【问题描述】:

在我的数据库中,我创建了一个带有列的表主题

id (long)
name (String)
ifActive (0 or 1)
text (very long String)

在我的网页中,我必须显示活动主题的名称列表。所以我在 xml 文件中声明了以下本机查询:

<sql-result-set-mapping name="SubjectResult">
    <entity-result entity-class="com.test.Subject">
        <field-result name="id" column="id"/>
        <field-result name="name" column="name"/>
        <field-result name="ifActive" column="ifActive"/>
        <field-result name="text" column="text"/>
    </entity-result>
</sql-result-set-mapping>

<entity class= "com.test.Subject" name= "Subject">
    <named-native-query name="findAllActiveSubject"
                        result-set-mapping="SubjectResult">
        <query>
            select
                *
            from 
                Subject
            where 
                ifActive = 1
        </query>
    </named-native-query>
</entity>

而且效果很好——我得到了主题对象的列表,我可以形成活动主题的名称列表。 但这就是问题所在:文本列中的文本很长,我真的不需要从数据库中检索它来形成活动主题的名称列表 - 我真的只需要主题的名称。

所以我将 SQL 查询更改为:

<sql-result-set-mapping name="SubjectResult">
    <entity-result entity-class="com.test.Subject">
        <field-result name="id" column="id"/>
        <field-result name="name" column="name"/>
        <field-result name="ifActive" column="ifActive"/>
        <field-result name="text" column="text"/>
    </entity-result>
</sql-result-set-mapping>

<entity class= "com.test.Subject" name= "Subject">
    <named-native-query name="findAllActiveSubject"
                        result-set-mapping="SubjectResult">
        <query>
            select
                name
            from 
                Subject
            where 
                ifActive = 1
        </query>
    </named-native-query>
</entity>

我得到异常

org.hibernate.exception.GenericJDBCException: could not execute query

根本原因

com.microsoft.sqlserver.jdbc.SQLServerException: The column name id is not valid

所以我尝试将结果集更改为以下:

<sql-result-set-mapping name="SubjectResult">
    <entity-result entity-class="com.test.Subject">
        <field-result name="name" column="name"/>
    </entity-result>
</sql-result-set-mapping>

<entity class= "com.test.Subject" name= "Subject">
    <named-native-query name="findAllActiveSubject"
                        result-set-mapping="SubjectResult">
        <query>
            select
                name
            from 
                Subject
            where 
                ifActive = 1
        </query>
    </named-native-query>
</entity>

我得到了异常

org.hibernate.exception.GenericJDBCException: could not execute query

有着非常奇怪的根本原因

com.microsoft.sqlserver.jdbc.SQLServerException: The column name id1_5_0_ is not valid

所以..

我不能只从数据库中检索几个列并只用它们形成主题吗?如果 Subject 的其余属性为空,对我来说没问题 - 我想完全使用 Subject 而不是值列表或值数组列表或类似的东西。

【问题讨论】:

【参考方案1】:

您可以使用 HQL 的特定构造函数

在Subject.java中创建构造器

...
public Subject() 


public Subject(String name) 
    this.name = name;

...

选择的查询应该是

select new Subject(s.name) from Subject s where s.ifActive=1

【讨论】:

以上是关于本机查询 - 如何仅从数据库中检索实体的特定列的主要内容,如果未能解决你的问题,请参考以下文章

仅从 Laravel 5.2 关系查询中选择特定列不起作用 [重复]

JPA Annotations - 如何检索具有特定列值的所有实体

不与特定表关联的实体的命名查询

Java JDBC 对要求仅从特定行返回详细信息的 SQL 查询抛出错误

如何仅从 R 中的特定列对中提取显着相关性?

R arules,仅从特定列中挖掘规则