英文:
org.hibernate.QueryException: illegal attempt to dereference collection [events0_.id.typesOfEvents] with element property reference [type_id]
问题
我正在使用 Spring Boot 和 JPA 构建 RESTful API。当我尝试获取事件列表时,出现了以下错误 - org.hibernate.QueryException: 尝试使用元素属性引用[type_id] 非法地取消引用集合 [events0_.id.typesOfEvents]。
我将 List 对象作为参数传递到 JPA 自定义查询的构造函数中,但是该查询不会执行,而会触发错误。
Event 是主要实体,在此实体内,我使用 ManyToMany 关系获取了类型事件的 List,并且这两个表的 Id 存储在第三个表中。
1. Event.java
(原文已省略)
2. EventDTO.java
(原文已省略)
3. 查询
(原文已省略)
4. 错误
(原文已省略)
英文:
I am using spring boot and jpa with restful api. when i am trying to get list of event then this type of error occurs - org.hibernate.QueryException: illegal attempt to dereference collection [events0_.id.typesOfEvents] with element property reference [type_id]
I am passing List Object to constructor as args into jpa custom query but that query will not execute it will fire error.
Event is Main entity inside this entity i have taken List of typeOfEvents with using ManyToMany relation and that two table of Id is stored into third table.
1.Event.java
@Builder
@ToString
@Entity
@Table(name = "events")
public @Data
class Events implements Comparable<Events> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Long id;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "site_id")
private Sites sites;
@Column
private boolean multipleDays;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "events_types",
joinColumns = @JoinColumn(name = "e_id"),
inverseJoinColumns = @JoinColumn(name = "t_id", unique = false))
private List<TypesOfEvents> typesOfEvents = new ArrayList<TypesOfEvents>(Arrays.asList());
@ManyToMany(cascade = CascadeType.DETACH)
@JoinTable(name = "events_format",
joinColumns = @JoinColumn(name = "e_id"),
inverseJoinColumns = @JoinColumn(name = "fs_id", unique = false))
private List<FormatStructure> formatStructure = new ArrayList<>();
@Column
private String startDate;
@Column
private String startTime;
@Column
private String endDate;
@Column
private String endTime;
@Column
private String eventName;
@Column
private String subTitle;
@Column
private String description;
@Column
private String location;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "city_id")
private City city;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "venue_one_off_option_id")
private VenueOneOffOptions venueOneOffOptions;
@Column
private double fee;
@Column
private boolean paid;
@Column
private String eventImg;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "event_passport_option_id")
private EventPassportOptions eventPassportOptions;
@Column
private int passportTickets;
@Column
private int remainingTickets;
@Column
private boolean passport;
@Column
private int passportDiscountPercent;
@Column
private String promoCode;
@Column
private String siteUrl;
@Column
private String ticketPurchaseSite;
@Column
private String videoUrl;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "primary_contact_member_id")
private Members primary_contact_member_id;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "created_member_id")
private Members created_member_id;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "group_id")
private Groups groups;
@Column
private String expectedAttendance;
@Column
private boolean myFavourite;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "eventStatusId")
private EventStatus eventStatus;
@Column
private boolean purchasedPromotionalEmails;
@Column
private boolean featured;
@ManyToMany(cascade = CascadeType.DETACH)
@JoinTable(name = "events_audience_types",
joinColumns = @JoinColumn(name = "e_id"),
inverseJoinColumns = @JoinColumn(name = "at_id", unique = false))
private List<AudienceTypes> audienceTypes = new ArrayList<>();
@ManyToMany(cascade = CascadeType.DETACH)
@JoinTable(name = "events_food_options",
joinColumns = @JoinColumn(name = "e_id"),
inverseJoinColumns = @JoinColumn(name = "fo_id", unique = false))
private List<FoodOptions> foodOptions = new ArrayList<>();
public Events() {
}
@Override
public int compareTo(Events o) {
return (int) (this.id - o.id);
}
}
2.EventDTO.java
@ToString
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.CUSTOM)
public @Data
class TestDTO implements Comparable<TestDTO>{
private Long id;
private boolean multipleDays;
private List<TypesOfEvents> eventType = new ArrayList<>(Arrays.asList());
private String startDate;
private String startTime;
private String endDate;
private String endTime;
private String eventName;
private String subTitle;
private String location;
private String city;
private double fee;
private boolean paid;
private String eventImg;
private Long passportOption;
private int passportTickets;
private int remainingTickets;
private boolean passport;
private String promoCode;
private String expectedAttendance;
private boolean myFavourite;
private String eventStatus;
private boolean featured;
public TestDTO(Long id, boolean multipleDays, List<TypesOfEvents> eventType, String startDate, String startTime, String endDate, String endTime, String eventName, String subTitle, String location, String city, double fee, boolean paid, String eventImg, Long passportOption, int passportTickets, int remainingTickets, boolean passport, String promoCode, String expectedAttendance, boolean myFavourite, String eventStatus, boolean featured) {
this.id = id;
this.multipleDays = multipleDays;
this.eventType = eventType;
this.startDate = startDate;
this.startTime = startTime;
this.endDate = endDate;
this.endTime = endTime;
this.eventName = eventName;
this.subTitle = subTitle;
this.location = location;
this.city = city;
this.fee = fee;
this.paid = paid;
this.eventImg = eventImg;
this.passportOption = passportOption;
this.passportTickets = passportTickets;
this.remainingTickets = remainingTickets;
this.passport = passport;
this.promoCode = promoCode;
this.expectedAttendance = expectedAttendance;
this.myFavourite = myFavourite;
this.eventStatus = eventStatus;
this.featured = featured;
}
}
3.Query
@Query("SELECT new com.test.responseDTO.TestDTO(e.id, e.multipleDays, e.typesOfEvents, e.startDate, e.startTime, e.endDate, e.endTime, e.eventName, e.subTitle, e.location, c.name, e.fee, e.paid, e.eventImg, p.event_passport_option_id, e.passportTickets, e.remainingTickets, e.passport, e.promoCode, e.expectedAttendance, e.myFavourite, s.status, e.featured)" +
" from Events e LEFT JOIN e.typesOfEvents.type_id t JOIN e.city c JOIN e.eventPassportOptions p JOIN e.eventStatus s WHERE e.startDate BETWEEN :startDate AND :endDate AND e.endDate BETWEEN :startDate AND :endDate ORDER BY e.startDate, e.id ASC")
List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);
4.Error
org.hibernate.QueryException: illegal attempt to dereference collection [events0_.id.typesOfEvents] with element property reference [type_id]
答案1
得分: 0
以下是翻译好的部分:
@Query("SELECT new com.test.responseDTO.TestDTO(e.id, e.multipleDays, e.typesOfEvents, e.startDate, e.startTime, e.endDate, e.endTime, e.eventName, e.subTitle, e.location, c.name, e.fee, e.paid, e.eventImg, p.event_passport_option_id, e.passportTickets, e.remainingTickets, e.passport, e.promoCode, e.expectedAttendance, e.myFavourite, s.status, e.featured)" +
" from Events e LEFT JOIN e.typesOfEvents t /*this fixed*/ JOIN e.city c JOIN e.eventPassportOptions p JOIN e.eventStatus s WHERE e.startDate BETWEEN :startDate AND :endDate AND e.endDate BETWEEN :startDate AND :endDate ORDER BY e.startDate, e.id ASC")
List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);
我的更改后的查询:
@Query("SELECT new com.techavidus.networkingPhoniex.responseDTO.TestDTO(e.id, e.multipleDays, t, e.startDate, e.startTime, e.endDate, e.endTime, e.eventName, e.subTitle, e.location, c.name, e.fee, e.paid, e.eventImg, p.event_passport_option_id, e.passportTickets, e.remainingTickets, e.passport, e.promoCode, e.expectedAttendance, e.myFavourite, s.status, e.featured)" +
" from Events e LEFT JOIN e.typesOfEvents t JOIN e.city c JOIN e.eventPassportOptions p JOIN e.eventStatus s WHERE e.startDate BETWEEN :startDate AND :endDate AND e.endDate BETWEEN :startDate AND :endDate ORDER BY e.startDate, e.id ASC")
List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);
输出:
{
"success": true,
"message": "记录成功查找。",
"data": [
{
"date": "2020/05/28",
"count": 2,
"events": [
{
"id": 1,
"multipleDays": true,
"eventType": {
"type_id": 1,
"type": "Musician1",
"paid_listing": false,
"color": "Black",
"_enabled": true
},
"startDate": "2020/05/28",
"startTime": "10:12:15",
"endDate": "2020/05/30",
"endTime": "20:18:25",
"eventName": "测试",
"subTitle": "测试演示",
"location": "字符串",
"city": "布胡吉",
"fee": 49,
"paid": false,
"eventImg": "图片网址",
"passportOption": 1,
"passportTickets": 0,
"remainingTickets": 0,
"passport": false,
"promoCode": "TEST123",
"expectedAttendance": "1500",
"myFavourite": false,
"eventStatus": "待批准",
"featured": false
},
{
"id": 1,
"multipleDays": true,
"eventType": {
"type_id": 2,
"type": "个人成长",
"paid_listing": true,
"color": "Black",
"_enabled": true
},
"startDate": "2020/05/28",
"startTime": "10:12:15",
"endDate": "2020/05/30",
"endTime": "20:18:25",
"eventName": "测试",
"subTitle": "测试演示",
"location": "字符串",
"city": "布胡吉",
"fee": 49,
"paid": false,
"eventImg": "图片网址",
"passportOption": 1,
"passportTickets": 0,
"remainingTickets": 0,
"passport": false,
"promoCode": "TEST123",
"expectedAttendance": "1500",
"myFavourite": false,
"eventStatus": "待批准",
"featured": false
}
]
}
]
}
英文:
You reference type_id
from list which its not allowed here, because query expression referring type_id
to list, not to entity itself. So only replace this LEFT JOIN e.typesOfEvents.type_id t
with LEFT JOIN e.typesOfEvents t
and it would be work fine. And it would reference variable t
to element from list(Relation).
@Query("SELECT new com.test.responseDTO.TestDTO(e.id, e.multipleDays, e.typesOfEvents, e.startDate, e.startTime, e.endDate, e.endTime, e.eventName, e.subTitle, e.location, c.name, e.fee, e.paid, e.eventImg, p.event_passport_option_id, e.passportTickets, e.remainingTickets, e.passport, e.promoCode, e.expectedAttendance, e.myFavourite, s.status, e.featured)" +
" from Events e LEFT JOIN e.typesOfEvents t /*this fixed*/ JOIN e.city c JOIN e.eventPassportOptions p JOIN e.eventStatus s WHERE e.startDate BETWEEN :startDate AND :endDate AND e.endDate BETWEEN :startDate AND :endDate ORDER BY e.startDate, e.id ASC")
List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);
My Query with changes into TestDTO
@Query("SELECT new com.techavidus.networkingPhoniex.responseDTO.TestDTO(e.id, e.multipleDays, t, e.startDate, e.startTime, e.endDate, e.endTime, e.eventName, e.subTitle, e.location, c.name, e.fee, e.paid, e.eventImg, p.event_passport_option_id, e.passportTickets, e.remainingTickets, e.passport, e.promoCode, e.expectedAttendance, e.myFavourite, s.status, e.featured)" +
" from Events e LEFT JOIN e.typesOfEvents t JOIN e.city c JOIN e.eventPassportOptions p JOIN e.eventStatus s WHERE e.startDate BETWEEN :startDate AND :endDate AND e.endDate BETWEEN :startDate AND :endDate ORDER BY e.startDate, e.id ASC")
List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);
output :
{
"success": true,
"message": "Record's find successfully.",
"data": [
{
"date": "2020/05/28",
"count": 2,
"events": [
{
"id": 1,
"multipleDays": true,
"eventType": {
"type_id": 1,
"type": "Musician1",
"paid_listing": false,
"color": "Black",
"_enabled": true
},
"startDate": "2020/05/28",
"startTime": "10:12:15",
"endDate": "2020/05/30",
"endTime": "20:18:25",
"eventName": "Test",
"subTitle": "Testing demo",
"location": "string",
"city": "Bhuj",
"fee": 49,
"paid": false,
"eventImg": "Imgage url",
"passportOption": 1,
"passportTickets": 0,
"remainingTickets": 0,
"passport": false,
"promoCode": "TEST123",
"expectedAttendance": "1500",
"myFavourite": false,
"eventStatus": "Pending Approval",
"featured": false
},
{
"id": 1,
"multipleDays": true,
"eventType": {
"type_id": 2,
"type": "Personal Growth",
"paid_listing": true,
"color": "Black",
"_enabled": true
},
"startDate": "2020/05/28",
"startTime": "10:12:15",
"endDate": "2020/05/30",
"endTime": "20:18:25",
"eventName": "Test",
"subTitle": "Testing demo",
"location": "string",
"city": "Bhuj",
"fee": 49,
"paid": false,
"eventImg": "Imgage url",
"passportOption": 1,
"passportTickets": 0,
"remainingTickets": 0,
"passport": false,
"promoCode": "TEST123",
"expectedAttendance": "1500",
"myFavourite": false,
"eventStatus": "Pending Approval",
"featured": false
}
]
}
]
}
专注分享java语言的经验与见解,让所有开发者获益!
评论