Есть 2 сущьности User и Role. Мне нужно сделать выборку User что бы Role которая у User на полях тоже инициализировалась.
Что то вроде Hibernate.initialize(User.getRole()).
Или жадной выборки :
from User u join fetch u.role where u.username := username and u.password := password и как-то сделать .setParameter().
Но так как я использую интерфейс CrudRepository<T, ID extends Serializable> то мне надо использовать характерный для Spring Data подход.
Испробовал уже много вариантов не буду захламлять ими вопрос. Но если в 2-х словах все упирается в валидность синтаксиса Query() аннотации для метода:
public interface UserRepository extends CrudRepository<User, Integer> {
@Query("...?...")
User findDistinctFirstByUsernameAndPassword(String username, String password);
}
Помогите пожалуйста это решить, наверняка Spring data позволяет это делать, возможно нужно выбрать другой интерфейс или как-то хитро построить запрос..? Спасибо.
Вот мои сущьности:
@Entity(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "enabled")
private boolean enabled;
@OneToMany()
@JoinColumn(name = "username")
private List<Role> role;
...get & set & constr...
}
@Entity(name = "user_roles")
public class Role {
@Id
@Column(name = "user_role_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "username")
private String username;
@Column(name = "role")
private String role;
...get & set & constr...
}
UPDATE
Таблицы
CREATE TABLE users (
id SERIAL NOT NULL,
username VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (username)
);
CREATE TABLE user_roles (
user_role_id SERIAL PRIMARY KEY,
username VARCHAR(20) NOT NULL,
role VARCHAR(20) NOT NULL,
UNIQUE (username, role),
FOREIGN KEY (username) REFERENCES users (username)
);
Если вам необходимо иногда выбирать жадно, а иногда лениво, и поэтому не подходит указание типа выборки в аннотации @OneToMany(fetch = FetchType.EAGER), то можно попробовать воспользоваться стратегией загрузки графа:
@Entity(name = "users")
@NamedEntityGraph(name = "User.detail", attributeNodes = @NamedAttributeNode("role"))
public class User {
...
@OneToMany()
@JoinColumn(name = "username")
private List<Role> role;
...
}
public interface UserRepository extends CrudRepository<User, Integer> {
@EntityGraph(value = "User.detail", type = EntityGraphType.LOAD)
User findDistinctFirstByUsernameAndPassword(String username, String password);
}
Продвижение своими сайтами как стратегия роста и независимости