当前位置: 首页 > 知识库问答 >
问题:

@NamedNativeQuery-如何将其绑定到存储库方法?

余天宇
2023-03-14

我使用的是Spring,我有一个特殊情况,需要通过查询获得非实体对象的列表。

我决定在SQLResultsMapping中使用ConstructorResult,并参考这里和这里提到的NamedNativeRequesty中的映射。

然而,在所有使用命名本机查询的示例中,它们通过PersistenceContext获取EntityManager实例,并在其上调用createNativeQuery,提供NamedNativeQuery的名称作为该调用的参数,如本答案所示。

如何将存储库接口中声明的方法映射到特定的NamedNativeRequesty?我的尝试是使用EntityName。MethodNameInRepository或MethodNameInRepository作为NamedNativeRequesty的名称,但运气不佳。

以下是我的简化代码:

@Entity(name = "AdDailyData")
@SqlResultSetMapping(
        name="RevenueByAppAndDayMapping",
        classes=@ConstructorResult(
                targetClass=RevenueByAppAndDay.class,
                columns={@ColumnResult(name="country_code"),
                        @ColumnResult(name="revenue", type=Double.class),
                        @ColumnResult(name="currency")}))
@NamedNativeQuery(
        name="AdDailyData.aggregateRevenue",
        query="SELECT country_code, sum(earnings) as revenue, currency "
                + "FROM ad_daily_data, pseudo_app, app "
                + "WHERE ad_daily_data.pseudo_app_id=pseudo_app.id AND pseudo_app.app_id=app.id AND app.id=:appId and ad_daily_data.day = :day "
                + "GROUP BY country_code, currency "
                + "ORDER BY country_code ASC",
        resultSetMapping="RevenueByAppAndDayMapping")
public class AdDailyDataEntity {

    // fields, getters, setters etc.

    public static interface Repository extends JpaRepository<AdDailyDataEntity, Long> {

        public List<RevenueByAppAndDay> aggregateRevenue(@Param("appId") long appId, @Param("day") LocalDate day);

    }

}

这是我的非Entity类。

public class RevenueByAppAndDay {

    private String countryCode;
    private Double earnings;
    private String currency;

    public RevenueByAppAndDay(String countryCode, Double earnings, String currency) {
        this.countryCode = countryCode;
        this.earnings = earnings;
        this.currency = currency;
    }

    public String getCountryCode() {
        return countryCode;
    }

    public Double getEarnings() {
        return earnings;
    }

    public String getCurrency() {
        return currency;
    }

}

非常感谢您的任何帮助。

编辑:堆栈跟踪的结尾如下所示:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property aggregateRevenue found for type AdDailyDataEntity!

共有2个答案

张翰海
2023-03-14

虽然答案是正确的,但对于来到这里接受类似提示的人来说,这对我来说很有用,不需要使用@namednativequiry:

public class Example {

private Long someProperty;
// getters and setters
}

要调用查询或存储过程并填充我的对象,请执行以下操作:

@Repository
public interface ExampleRepository extends 
JpaRepository<Example,Long> {

/**
 * Search Example by someProperty
 *
 * @param property
 * @return
 */
@Query( nativeQuery = true, value = "SELECT * FROM public.my_stored_procedure(:property)")
List<Example> findByProperty(@Param("property") Long property);

}

我知道这是另一种方法,代码是解耦的,但我们得到了相同的结果。

我希望这对某人有用。当做

欧阳昊焱
2023-03-14

需要将NamedNativeRequesty上的name值设置为AddDailyDataEntity.aggregateRevenue。第一部分(点之前)需要与实体类名匹配。

 类似资料:
  • 问题内容: 我正在使用+,并且在特殊情况下,由于查询,我需要获取(列表)非对象。 我决定使用in,并在其中引用此映射,如此处和此处所述。 但是,在所有使用命名本机查询的示例中,它们都通过获取实例并对其进行调用,从而为该调用提供of 参数,如该答案所示。 如何将存储库中声明的方法映射到特定对象?我的尝试是使用或作为的,但没有运气。 这是我的简化代码: 这是我的非班级。 任何帮助都将受到高度赞赏。 编

  • 我正在尝试创建一个Azure Function(. NET核心)以从存储帐户检索SaS,并且难以理解为什么我无法访问存储。 函数签名: 索引方法“GetBlobSaS”Microsoft时出错。蔚蓝色的网络作业。主机:无法将参数“storage”绑定到类型StorageAccount。确保绑定支持参数类型。如果您使用的是绑定扩展(例如Azure Storage、ServiceBus、Timers等

  • 问题内容: 我有一个JList和ArrayList。如何将arraylist中的数据绑定到jlist.Ares有替代方法吗? 如何绑定以上代码。现在代码给出错误。 问题答案: 您无需克隆ArrayList。只需调用toArray()

  • 问题内容: 我们有一个普通的独立spring应用程序,需要将jdbc数据源放在jndi中。(我们使用jboss treecache,它需要数据源位于jndi中)。 一些谷歌搜索人员发现了大多数使用Spring的jndi查找示例,其中已经在jndi中放置了一个对象(通过tomcat或应用服务器等),但是我们需要另外的方法:我有一个简单的数据源Spring bean,我将其注入到其他服务中,但我无法将

  • 我正在使用匕首2,我有一个定义如下的: 这是FYViewModel的: 但是,变量始终为空。 如何使用匕首2将Repositroy注入我的ViewModel?