Я использую postgres и имею модель EAV, это пример сопоставления (не оригинал).
@Entity
public class User {
@Id
@Column(name = "id", updatable = false, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private Set<UserPropertyValues> userPropertyValues;
}
@Entity
@Table
public class UserPropertyValues {
@Id
@Column(name = "id", updatable = false, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String value; //Hold actual value of the property
@ManyToOne
@JoinColumn(name = "property_id")
private Property property;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false, insertable = false, updatable = false)
private User user;
}
@Entity
@Table
public class Property {
@Id
@Column(name = "id", updatable = false, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
}
Я хочу получить список со всеми именами свойств, даже если свойство не сопоставлен с конкретным пользователем с помощью сущности значения свойства. Есть ли более чистый способ сделать это в Spring JPA HQL с помощью одного запроса?
В настоящее время я использую следующий HQL, но он, очевидно, не дает мне несопоставленных имен свойств пользователя.
select u from User u left join fetch u.propertyValues pv left join fetch pv.properties;