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

时间:2017-07-02 14:17:31

标签: java spring hibernate jpa spring-data-jpa

我正在使用Spring + Hibernate我有一个特殊情况,我需要在查询结果中获取非Entity个对象的列表。

我决定在@ConstructorResult中使用@SqlResultSetMapping并在@NamedNativeQuery中引用此映射,如上所述herehere

但是,在使用命名本机查询的所有示例中,他们通过EntityManager获取@PersistenceContext个实例并在其上调用createNativeQuery,提供name @NamedNativeQuery作为该调用的参数,如this answer。

中所示

如何将存储库interface中声明的方法映射到特定的@NamedNativeQuery?我的尝试是使用EntityName.MethodNameInRepositoryMethodNameInRepository作为name的{​​{1}},但没有运气。

这是我的简化代码:

@NamedNativeQuery

这是我的非@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;
    }

}

2 个答案:

答案 0 :(得分:8)

name上的@NamedNativeQuery值需要设置为"AdDailyDataEntity.aggregateRevenue"。第一部分(在点之前)需要匹配实体类名称。

答案 1 :(得分:-1)

尽管答案是正确的,但是对于某人到达这里进行类似的授课,这对我有用,而无需使用@NamedNativeQuery:

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);

}

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

我希望这对某人有用。 问候。