Java 在JPA实体中将不存在列用作SQL中的别名时,将其存储在该实体中

Java 在JPA实体中将不存在列用作SQL中的别名时,将其存储在该实体中,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我编写了一个查询来统计指定企业下可用的位置数。SQL查询如下所示 SELECT e.enterprise_id, e.ent_name, ( SELECT count(l.location_id) FROM rfx_ent_locations l WHERE l.loc_type_id <> 1001 AND e.enterprise_id = l.enterprise_id ) AS locCount FROM rfx_enterprise

我编写了一个查询来统计指定企业下可用的位置数。SQL查询如下所示

SELECT 
e.enterprise_id,
e.ent_name,
(
    SELECT count(l.location_id)
    FROM rfx_ent_locations l
    WHERE l.loc_type_id <> 1001
        AND e.enterprise_id = l.enterprise_id
) AS locCount
FROM rfx_enterprises e
WHERE  e.partner_type = 102;
Query query = session.createQuery("SELECT count(l.location_id)
    FROM rfx_ent_locations l
    WHERE l.loc_type_id <> 1001
        AND e.enterprise_id = l.enterprise_id");// do as you please with the query result

    /**
     * instead of doing a second query to get the count.  Just do a quick count using Iterator
     */

    for (Iterator iterator = query.iterate(); iterator.hasNext();) {
        iterator.next();
        count++;
    }

    Integer queryCount = count;

如果在实体中作为列引入,我会得到一个错误,说找不到列。要使用JPA作为实体(包括用作别名的locCount)进行检索,我应该如何进行?

不要使用该实体进行计数查询。像这样单独进行

SELECT 
e.enterprise_id,
e.ent_name,
(
    SELECT count(l.location_id)
    FROM rfx_ent_locations l
    WHERE l.loc_type_id <> 1001
        AND e.enterprise_id = l.enterprise_id
) AS locCount
FROM rfx_enterprises e
WHERE  e.partner_type = 102;
Query query = session.createQuery("SELECT count(l.location_id)
    FROM rfx_ent_locations l
    WHERE l.loc_type_id <> 1001
        AND e.enterprise_id = l.enterprise_id");// do as you please with the query result

    /**
     * instead of doing a second query to get the count.  Just do a quick count using Iterator
     */

    for (Iterator iterator = query.iterate(); iterator.hasNext();) {
        iterator.next();
        count++;
    }

    Integer queryCount = count;
将此queryCount设置为类中的@transient varible setter方法,这样就可以进行计数

或 像这样试试


干杯

不要用这个来做计数查询。像这样分开做

SELECT 
e.enterprise_id,
e.ent_name,
(
    SELECT count(l.location_id)
    FROM rfx_ent_locations l
    WHERE l.loc_type_id <> 1001
        AND e.enterprise_id = l.enterprise_id
) AS locCount
FROM rfx_enterprises e
WHERE  e.partner_type = 102;
Query query = session.createQuery("SELECT count(l.location_id)
    FROM rfx_ent_locations l
    WHERE l.loc_type_id <> 1001
        AND e.enterprise_id = l.enterprise_id");// do as you please with the query result

    /**
     * instead of doing a second query to get the count.  Just do a quick count using Iterator
     */

    for (Iterator iterator = query.iterate(); iterator.hasNext();) {
        iterator.next();
        count++;
    }

    Integer queryCount = count;
将此queryCount设置为类中的@transient varible setter方法,这样就可以进行计数

或 像这样试试


干杯

这两种方法都行不通。无法将结果设置为@transient变量。第二个查询将返回可用记录的总数。这两种方法都不起作用。无法将结果设置为@transient变量。第二个查询将返回可用记录的总数。您的问题不清楚。是否尝试通过EntityManager.createNativeQuery运行此查询?如果是,则不确定“检索为实体”是什么意思。@SteveEbersole:如果我以本机查询的形式编写,则需要分配给实体类。本机查询的结果被分配给映射了列的实体。此外,如果我有像locCount这样的额外列,我如何映射?您的问题不清楚。是否尝试通过EntityManager.createNativeQuery运行此查询?如果是,则不确定“检索为实体”是什么意思。@SteveEbersole:如果我以本机查询的形式编写,则需要分配给实体类。本机查询的结果被分配给映射了列的实体。另外,如果我有像locCount这样的额外列,我如何映射?