我正在使用Spring
+ Hibernate
我有一个特殊情况,我需要在查询结果中获取非Entity
个对象的列表。
我决定在@ConstructorResult
中使用@SqlResultSetMapping
并在@NamedNativeQuery
中引用此映射,如上所述here和here。
但是,在使用命名本机查询的所有示例中,他们通过EntityManager
获取@PersistenceContext
个实例并在其上调用createNativeQuery
,提供name
@NamedNativeQuery
作为该调用的参数,如this answer。
如何将存储库interface
中声明的方法映射到特定的@NamedNativeQuery
?我的尝试是使用EntityName.MethodNameInRepository
或MethodNameInRepository
作为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;
}
}
答案 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);
}
我知道这是另一种方法,并且代码已解耦,但是我们得到的结果相同。
我希望这对某人有用。 问候。