我有一个用户和角色的存储库。两个实体在DB中有不同的表。我尝试加载角色
像Hibernate.initialize(User.get角色())
或相同的想法从用户u加入获取u.role其中u.username:=用户名和u.password:=密码
,但使用Spring数据CrudRepository
与LoadGraph。但是当我调用findDIinctFirstByUsernameAndPassword
时,我得到了异常。请帮我解决这个问题。谢谢你。
存储库:
public interface UserRepository extends CrudRepository<User, Integer> {
@EntityGraph(value = "User.detail", type = EntityGraphType.LOAD)
User findDistinctFirstByUsernameAndPassword(String username, String password);
}
例外:
WARN: HHH000104: firstResult/max使用集合读取指定的结果;在内存中应用!Hibernate:选择不同的user0_. id作为id1_1_0_,role1_user_role_iduser_rol1_0_1_,user0_启用enabled2_1_0_,user0_密码password3_1_0_,user0_用户名username4_1_0_,role1_角色role2_0_1_,role1_用户名username3_0_1_,role1_用户名username3_0_0__,role1_user_role_id用户user_rol1_0_0__user0_左向外连接user_rolesrole1_在user0_. id=role1_. usernameuser0_. username=?user0_密码16, 2017 10:21:41PMorg.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions警告:SQL错误: 0, SQLState: 4288316, 2017 10:21:41PMorg.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions错误:错误:运算符不存在:整数=字符变化没有运算符匹配给定的名称和参数类型。可能需要添加显式类型转换。职位: 383
org.springframework.dao.InvalidDataAccessResourceUsageExc0019:无法提取ResultSet;SQL[n/a];嵌套异常是org.hibernate.exception.SQLGrammarExc0019:无法提取ResultSet
这是实体:
@Entity(name = "users")
@NamedEntityGraph(name = "User.detail", attributeNodes = @NamedAttributeNode("role"))
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;
...set, get, empty constructor...
}
@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;
...set, get, empty constructor...
}
数据库架构:
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)
);
运行方法:
private final ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("spring-data-context.xml");
private UserRepository repository = context.getBean(UserRepository.class);
@Test
public void whenUserExistInDBThenGetUserWithLoadedRoles() {
final User result = repository
.findDistinctFirstByUsernameAndPassword("peter", "peter");
assertNotNull(result);
result.getRole().forEach(System.out::println);
}
我认为您的实体定义不正确,从执行的SQL中可以看出:
... on user0_.id=role1_.username
看看Wikibooks中的JPA示例。你的情况应该是这样的
public class User {
...
@OneToMany
private List<Role> role;
...
}
public class Role {
...
@ManyToOne
@JoinColumn(name = "username", referencedColumnName = "username")
private User user;
...
}
(用户名
列应从Role
中删除)
问题内容: 我正在尝试从JSON网址获取集合。骨干网确实发送了请求并得到了响应,但是在它之后的集合中没有: 这是我的JavaScript: 响应中的JSON 响应中的Content-Type HTTP标头为。 为什么不将其加载到集合中?JSON是否正确? 一些更多的代码: 问题答案: 是异步的。尝试 要么 要么
问题内容: 我有三部分字符串,每个部分用 符号分隔 。例如, 现在,当我使用这样的方法拆分它时: 它包含整个字符串作为单个元素的数组。 但是当我使用这个: 它完美的作品是什么,我想这意味着 现在的数组包含,并分别对指数0,1和2。 我想知道为什么第一次使用时不起作用,因为我在使用 问题答案: 因为字符是在正则表达式中用来标记行尾的保留令牌。因此,您必须使用进行 转义。
问题内容: 我现在有点困惑。我尝试过: 并得到: 但是,我想要: 我的代码有什么问题? 问题答案: 您没有将其分配给。字符串是 不可变的 。 您需要将其分配回。
问题内容: 我正在尝试这样做: 第一行有效: 但是接下来的两个: 和 只是输出 为什么? 问题答案: 因为你需要加入同,只是列出了内容直接,内容不具有完整路径。 范例- 如果未提供完整路径,则在当前目录中搜索,因此当您给出时,将获得正确的列表。 范例- 假设某个文件夹-具有文件-并在其中。 当您执行-时,返回的列表类似于- 即使您在其中提供绝对路径,列表中返回的文件也将具有指向目录的相对路径。您将
我想知道两次当地约会之间的时间。我使用了下面的代码: 我有以下错误:
我有三个部分的字符串,每个部分用symbol 分隔, 现在,当我使用这样的方法拆分它时: 它数组将整个字符串作为单个元素包含。 但当我使用这个: 它完美地工作,我想要的意思是 现在数组包含,和分别在索引0,1和2上。 我想知道为什么第一个不起作用,因为我使用类似的在使用