当前位置: 首页 > 知识库问答 >
问题:

为什么LoadGraphs不起作用?

严宏朗
2023-03-14

我有一个用户和角色的存储库。两个实体在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);
}

共有1个答案

周伟泽
2023-03-14

我认为您的实体定义不正确,从执行的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上。 我想知道为什么第一个不起作用,因为我使用类似的在使用