org.hibernate.QueryException: illegal attempt to dereference collection [events0_.id.typesOfEvents] with element property reference [type_id]

huangapple 未分类评论52阅读模式
英文:

org.hibernate.QueryException: illegal attempt to dereference collection [events0_.id.typesOfEvents] with element property reference [type_id]

问题

  1. 我正在使用 Spring Boot JPA 构建 RESTful API。当我尝试获取事件列表时,出现了以下错误 - org.hibernate.QueryException: 尝试使用元素属性引用[type_id] 非法地取消引用集合 [events0_.id.typesOfEvents]。
  2. 我将 List 对象作为参数传递到 JPA 自定义查询的构造函数中,但是该查询不会执行,而会触发错误。
  3. Event 是主要实体,在此实体内,我使用 ManyToMany 关系获取了类型事件的 List,并且这两个表的 Id 存储在第三个表中。
  4. 1. Event.java
  5. (原文已省略)
  6. 2. EventDTO.java
  7. (原文已省略)
  8. 3. 查询
  9. (原文已省略)
  10. 4. 错误
  11. (原文已省略)
英文:

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

  1. @Builder
  2. @ToString
  3. @Entity
  4. @Table(name = "events")
  5. public @Data
  6. class Events implements Comparable<Events> {
  7. @Id
  8. @GeneratedValue(strategy = GenerationType.IDENTITY)
  9. @Column
  10. private Long id;
  11. @ManyToOne(cascade = CascadeType.REFRESH)
  12. @JoinColumn(name = "site_id")
  13. private Sites sites;
  14. @Column
  15. private boolean multipleDays;
  16. @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  17. @JoinTable(name = "events_types",
  18. joinColumns = @JoinColumn(name = "e_id"),
  19. inverseJoinColumns = @JoinColumn(name = "t_id", unique = false))
  20. private List<TypesOfEvents> typesOfEvents = new ArrayList<TypesOfEvents>(Arrays.asList());
  21. @ManyToMany(cascade = CascadeType.DETACH)
  22. @JoinTable(name = "events_format",
  23. joinColumns = @JoinColumn(name = "e_id"),
  24. inverseJoinColumns = @JoinColumn(name = "fs_id", unique = false))
  25. private List<FormatStructure> formatStructure = new ArrayList<>();
  26. @Column
  27. private String startDate;
  28. @Column
  29. private String startTime;
  30. @Column
  31. private String endDate;
  32. @Column
  33. private String endTime;
  34. @Column
  35. private String eventName;
  36. @Column
  37. private String subTitle;
  38. @Column
  39. private String description;
  40. @Column
  41. private String location;
  42. @ManyToOne(cascade = CascadeType.REFRESH)
  43. @JoinColumn(name = "city_id")
  44. private City city;
  45. @ManyToOne(cascade = CascadeType.REFRESH)
  46. @JoinColumn(name = "venue_one_off_option_id")
  47. private VenueOneOffOptions venueOneOffOptions;
  48. @Column
  49. private double fee;
  50. @Column
  51. private boolean paid;
  52. @Column
  53. private String eventImg;
  54. @ManyToOne(cascade = CascadeType.REFRESH)
  55. @JoinColumn(name = "event_passport_option_id")
  56. private EventPassportOptions eventPassportOptions;
  57. @Column
  58. private int passportTickets;
  59. @Column
  60. private int remainingTickets;
  61. @Column
  62. private boolean passport;
  63. @Column
  64. private int passportDiscountPercent;
  65. @Column
  66. private String promoCode;
  67. @Column
  68. private String siteUrl;
  69. @Column
  70. private String ticketPurchaseSite;
  71. @Column
  72. private String videoUrl;
  73. @ManyToOne(cascade = CascadeType.REFRESH)
  74. @JoinColumn(name = "primary_contact_member_id")
  75. private Members primary_contact_member_id;
  76. @ManyToOne(cascade = CascadeType.REFRESH)
  77. @JoinColumn(name = "created_member_id")
  78. private Members created_member_id;
  79. @ManyToOne(cascade = CascadeType.REFRESH)
  80. @JoinColumn(name = "group_id")
  81. private Groups groups;
  82. @Column
  83. private String expectedAttendance;
  84. @Column
  85. private boolean myFavourite;
  86. @ManyToOne(cascade = CascadeType.REFRESH)
  87. @JoinColumn(name = "eventStatusId")
  88. private EventStatus eventStatus;
  89. @Column
  90. private boolean purchasedPromotionalEmails;
  91. @Column
  92. private boolean featured;
  93. @ManyToMany(cascade = CascadeType.DETACH)
  94. @JoinTable(name = "events_audience_types",
  95. joinColumns = @JoinColumn(name = "e_id"),
  96. inverseJoinColumns = @JoinColumn(name = "at_id", unique = false))
  97. private List<AudienceTypes> audienceTypes = new ArrayList<>();
  98. @ManyToMany(cascade = CascadeType.DETACH)
  99. @JoinTable(name = "events_food_options",
  100. joinColumns = @JoinColumn(name = "e_id"),
  101. inverseJoinColumns = @JoinColumn(name = "fo_id", unique = false))
  102. private List<FoodOptions> foodOptions = new ArrayList<>();
  103. public Events() {
  104. }
  105. @Override
  106. public int compareTo(Events o) {
  107. return (int) (this.id - o.id);
  108. }
  109. }

2.EventDTO.java

  1. @ToString
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @JsonIgnoreProperties(ignoreUnknown = true)
  5. @JsonInclude(JsonInclude.Include.CUSTOM)
  6. public @Data
  7. class TestDTO implements Comparable<TestDTO>{
  8. private Long id;
  9. private boolean multipleDays;
  10. private List<TypesOfEvents> eventType = new ArrayList<>(Arrays.asList());
  11. private String startDate;
  12. private String startTime;
  13. private String endDate;
  14. private String endTime;
  15. private String eventName;
  16. private String subTitle;
  17. private String location;
  18. private String city;
  19. private double fee;
  20. private boolean paid;
  21. private String eventImg;
  22. private Long passportOption;
  23. private int passportTickets;
  24. private int remainingTickets;
  25. private boolean passport;
  26. private String promoCode;
  27. private String expectedAttendance;
  28. private boolean myFavourite;
  29. private String eventStatus;
  30. private boolean featured;
  31. 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) {
  32. this.id = id;
  33. this.multipleDays = multipleDays;
  34. this.eventType = eventType;
  35. this.startDate = startDate;
  36. this.startTime = startTime;
  37. this.endDate = endDate;
  38. this.endTime = endTime;
  39. this.eventName = eventName;
  40. this.subTitle = subTitle;
  41. this.location = location;
  42. this.city = city;
  43. this.fee = fee;
  44. this.paid = paid;
  45. this.eventImg = eventImg;
  46. this.passportOption = passportOption;
  47. this.passportTickets = passportTickets;
  48. this.remainingTickets = remainingTickets;
  49. this.passport = passport;
  50. this.promoCode = promoCode;
  51. this.expectedAttendance = expectedAttendance;
  52. this.myFavourite = myFavourite;
  53. this.eventStatus = eventStatus;
  54. this.featured = featured;
  55. }
  56. }

3.Query

  1. @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)" +
  2. " 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")
  3. List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);

4.Error

  1. org.hibernate.QueryException: illegal attempt to dereference collection [events0_.id.typesOfEvents] with element property reference [type_id]

答案1

得分: 0

以下是翻译好的部分:

  1. @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)" +
  2. " 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")
  3. List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);

我的更改后的查询:

  1. @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)" +
  2. " 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")
  3. List<TestDTO> findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);

输出:

  1. {
  2. "success": true,
  3. "message": "记录成功查找。",
  4. "data": [
  5. {
  6. "date": "2020/05/28",
  7. "count": 2,
  8. "events": [
  9. {
  10. "id": 1,
  11. "multipleDays": true,
  12. "eventType": {
  13. "type_id": 1,
  14. "type": "Musician1",
  15. "paid_listing": false,
  16. "color": "Black",
  17. "_enabled": true
  18. },
  19. "startDate": "2020/05/28",
  20. "startTime": "10:12:15",
  21. "endDate": "2020/05/30",
  22. "endTime": "20:18:25",
  23. "eventName": "测试",
  24. "subTitle": "测试演示",
  25. "location": "字符串",
  26. "city": "布胡吉",
  27. "fee": 49,
  28. "paid": false,
  29. "eventImg": "图片网址",
  30. "passportOption": 1,
  31. "passportTickets": 0,
  32. "remainingTickets": 0,
  33. "passport": false,
  34. "promoCode": "TEST123",
  35. "expectedAttendance": "1500",
  36. "myFavourite": false,
  37. "eventStatus": "待批准",
  38. "featured": false
  39. },
  40. {
  41. "id": 1,
  42. "multipleDays": true,
  43. "eventType": {
  44. "type_id": 2,
  45. "type": "个人成长",
  46. "paid_listing": true,
  47. "color": "Black",
  48. "_enabled": true
  49. },
  50. "startDate": "2020/05/28",
  51. "startTime": "10:12:15",
  52. "endDate": "2020/05/30",
  53. "endTime": "20:18:25",
  54. "eventName": "测试",
  55. "subTitle": "测试演示",
  56. "location": "字符串",
  57. "city": "布胡吉",
  58. "fee": 49,
  59. "paid": false,
  60. "eventImg": "图片网址",
  61. "passportOption": 1,
  62. "passportTickets": 0,
  63. "remainingTickets": 0,
  64. "passport": false,
  65. "promoCode": "TEST123",
  66. "expectedAttendance": "1500",
  67. "myFavourite": false,
  68. "eventStatus": "待批准",
  69. "featured": false
  70. }
  71. ]
  72. }
  73. ]
  74. }
英文:

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

  1. @Query(&quot;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)&quot; +
  2. &quot; 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&quot;)
  3. List&lt;TestDTO&gt; findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);

My Query with changes into TestDTO

  1. @Query(&quot;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)&quot; +
  2. &quot; 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&quot;)
  3. List&lt;TestDTO&gt; findAllListOfEventsWithoutEventTypeIdWithOnlyTwoDateTest1(String startDate, String endDate);

output :

  1. {
  2. &quot;success&quot;: true,
  3. &quot;message&quot;: &quot;Record&#39;s find successfully.&quot;,
  4. &quot;data&quot;: [
  5. {
  6. &quot;date&quot;: &quot;2020/05/28&quot;,
  7. &quot;count&quot;: 2,
  8. &quot;events&quot;: [
  9. {
  10. &quot;id&quot;: 1,
  11. &quot;multipleDays&quot;: true,
  12. &quot;eventType&quot;: {
  13. &quot;type_id&quot;: 1,
  14. &quot;type&quot;: &quot;Musician1&quot;,
  15. &quot;paid_listing&quot;: false,
  16. &quot;color&quot;: &quot;Black&quot;,
  17. &quot;_enabled&quot;: true
  18. },
  19. &quot;startDate&quot;: &quot;2020/05/28&quot;,
  20. &quot;startTime&quot;: &quot;10:12:15&quot;,
  21. &quot;endDate&quot;: &quot;2020/05/30&quot;,
  22. &quot;endTime&quot;: &quot;20:18:25&quot;,
  23. &quot;eventName&quot;: &quot;Test&quot;,
  24. &quot;subTitle&quot;: &quot;Testing demo&quot;,
  25. &quot;location&quot;: &quot;string&quot;,
  26. &quot;city&quot;: &quot;Bhuj&quot;,
  27. &quot;fee&quot;: 49,
  28. &quot;paid&quot;: false,
  29. &quot;eventImg&quot;: &quot;Imgage url&quot;,
  30. &quot;passportOption&quot;: 1,
  31. &quot;passportTickets&quot;: 0,
  32. &quot;remainingTickets&quot;: 0,
  33. &quot;passport&quot;: false,
  34. &quot;promoCode&quot;: &quot;TEST123&quot;,
  35. &quot;expectedAttendance&quot;: &quot;1500&quot;,
  36. &quot;myFavourite&quot;: false,
  37. &quot;eventStatus&quot;: &quot;Pending Approval&quot;,
  38. &quot;featured&quot;: false
  39. },
  40. {
  41. &quot;id&quot;: 1,
  42. &quot;multipleDays&quot;: true,
  43. &quot;eventType&quot;: {
  44. &quot;type_id&quot;: 2,
  45. &quot;type&quot;: &quot;Personal Growth&quot;,
  46. &quot;paid_listing&quot;: true,
  47. &quot;color&quot;: &quot;Black&quot;,
  48. &quot;_enabled&quot;: true
  49. },
  50. &quot;startDate&quot;: &quot;2020/05/28&quot;,
  51. &quot;startTime&quot;: &quot;10:12:15&quot;,
  52. &quot;endDate&quot;: &quot;2020/05/30&quot;,
  53. &quot;endTime&quot;: &quot;20:18:25&quot;,
  54. &quot;eventName&quot;: &quot;Test&quot;,
  55. &quot;subTitle&quot;: &quot;Testing demo&quot;,
  56. &quot;location&quot;: &quot;string&quot;,
  57. &quot;city&quot;: &quot;Bhuj&quot;,
  58. &quot;fee&quot;: 49,
  59. &quot;paid&quot;: false,
  60. &quot;eventImg&quot;: &quot;Imgage url&quot;,
  61. &quot;passportOption&quot;: 1,
  62. &quot;passportTickets&quot;: 0,
  63. &quot;remainingTickets&quot;: 0,
  64. &quot;passport&quot;: false,
  65. &quot;promoCode&quot;: &quot;TEST123&quot;,
  66. &quot;expectedAttendance&quot;: &quot;1500&quot;,
  67. &quot;myFavourite&quot;: false,
  68. &quot;eventStatus&quot;: &quot;Pending Approval&quot;,
  69. &quot;featured&quot;: false
  70. }
  71. ]
  72. }
  73. ]
  74. }

huangapple
  • 本文由 发表于 2020年5月29日 20:31:38
  • 转载请务必保留本文链接:https://java.coder-hub.com/62086072.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定