Ответ 1
Значение name
на @NamedNativeQuery
должно быть установлено на "AdDailyDataEntity.aggregateRevenue"
. Первая часть (перед точкой) должна соответствовать имени класса сущности.
Я использую Spring
+ Hibernate
и у меня есть особый случай, когда мне нужно получить (список) объектов non- Entity
в результате запроса.
Я решил использовать @ConstructorResult
в @SqlResultSetMapping
и обратиться к этому отображению в @NamedNativeQuery
, как упомянуто здесь и здесь.
Однако во всех примерах, использующих именованные собственные запросы, они получают экземпляр EntityManager
через @PersistenceContext
и вызывают для него createNativeQuery
, предоставляя name
@NamedNativeQuery
качестве параметра для этого вызова, как видно из этого ответа.
Как сопоставить метод, объявленный в interface
репозитория, с конкретным @NamedNativeQuery
? Я пытался использовать EntityName.MethodNameInRepository
или MethodNameInRepository
в качестве name
@NamedNativeQuery
, но не повезло.
Вот мой упрощенный код:
@Entity(name = "AdDailyData")
@SqlResultSetMapping(
name="RevenueByAppAndDayMapping",
[email protected](
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
non-.
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!
Значение name
на @NamedNativeQuery
должно быть установлено на "AdDailyDataEntity.aggregateRevenue"
. Первая часть (перед точкой) должна соответствовать имени класса сущности.
Хотя ответ верен, для кого-то, кто прибыл сюда для подобных подсказок, это работает для меня без использования @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);
}
Я знаю, что это другой подход, и код отделен, но мы получаем тот же результат.
Я надеюсь, что это может быть полезно для кого-то. С уважением.