Java JPA加入spring引导应用程序

Java JPA加入spring引导应用程序,java,spring,hibernate,jpa,join,Java,Spring,Hibernate,Jpa,Join,我读过一些例子,但有我个人的问题要问你。 我有两张桌子: 角色: 身份证,姓名 用户: id、登录名、名称、角色\u id 角色实体 @实体 @表(name=“role”) 公共阶级角色{ @身份证 @列(name=“id”) 私人长id; @列(name=“name”,长度=45) 私有字符串名称; @OneToMany(cascade=CascadeType.ALL,mappedBy=“角色”) private Set user=new HashSet(); //接球手和接球手 用户实体

我读过一些例子,但有我个人的问题要问你。 我有两张桌子:

角色:
身份证,姓名
用户:
id、登录名、名称、角色\u id

角色实体
@实体
@表(name=“role”)
公共阶级角色{
@身份证
@列(name=“id”)
私人长id;
@列(name=“name”,长度=45)
私有字符串名称;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“角色”)
private Set user=new HashSet();
//接球手和接球手
用户实体
@实体
@表(name=“user”)
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“id”,insertable=false,updateable=false)
私人长id;
@列(name=“login”)
私有字符串登录;
@列(name=“user\u name”)
私有字符串用户名;
@manytone(fetch=FetchType.LAZY)
私人角色;
//接球手和接球手
和存储库:
public interface UserRepository扩展了JpaRepository{
字符串Q\u GET\u ALL\u USERS=“从用户u左加入角色r on u.Role\u id=r.id”;
@查询(Q_获取所有用户)
集合getAllUsers();
此代码显示:
原因:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:Path应为join![来自com.example.jpa.model.User u在u.Role\u id=r.id上左join Role r]

我如何理解实体不能包含引用的“id”(在我的例子中是在
角色中),我应该删除此字段。但实体应该有“@id”

在这种情况下,我应该在“角色”中创建新列?或者我可以使用更漂亮的决策


我把所有项目都放到了否,您应该在
用户中创建一个新列

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id")
private Role role;
要在HQL(JPQL)中使用join,您不需要
on
子句

String Q_GET_ALL_USERS = "select u from User u left join u.role";
此查询没有任何意义,因为您没有在where子句中使用
role

如果要获取具有已获取角色的用户,可以使用
join fetch

String Q_GET_ALL_USERS = "select u from User u left join fetch u.role";
更新

您的
用户
角色
的架构不常用。我建议您在用户和角色之间建立
@manytomy
关联,并从
角色
中删除任何
用户
关联

@Entity
@Table(name = "user")
public class User {

    @ManyToMany(fetch = FetchType.LAZY)
    private Set<Role> roles;

}

@Entity
@Table(name = "role")
public class Role {

    @Id
    @Column(name = "id")
    private long id;

    @Column(name = "name", length = 45)
    private String name;

}
@实体
@表(name=“user”)
公共类用户{
@ManyToMany(fetch=FetchType.LAZY)
私人设定角色;
}
@实体
@表(name=“role”)
公共阶级角色{
@身份证
@列(name=“id”)
私人长id;
@列(name=“name”,长度=45)
私有字符串名称;
}

谢谢大家的回答。右键单击下面的实体和查询(加上表格模式)

表(查询)

实体:

@Entity
@Table(name = "user")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id",insertable = false, updatable = false)
private long id;

@Column(name = "login")
private String login;

@Column(name = "user_name")
private String userName;

@ManyToOne(fetch = FetchType.LAZY)
private Role role;

//getters and setters
}

@实体
@表(name=“role”)
公共阶级角色{
@身份证
@列(name=“id”)
私人长id;
@列(name=“name”,长度=45)
私有字符串名称;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“角色”)
private Set user=new HashSet();
//接球手和接球手
}
存储库

public interface UserRepository extends JpaRepository<User, Long> {

String Q_GET_ALL_USERS = "select u from User u left join u.role";

@Query(Q_GET_ALL_USERS)
Collection<User> getAllUsers();
}
public interface UserRepository扩展了JpaRepository{
字符串Q_GET_ALL_USERS=“从用户u中选择u left join u.role”;
@查询(Q_获取所有用户)
集合getAllUsers();
}
建议的备选决策(仅在
用户
中使用
@ManyToMany
)。更多详细信息,请参见此项下的评论。 当我检查这个决定时,我会更新这个答案(我希望我不会忘记它:-)

型号

控制器

结果:


您忘记了“选择u”从您的JPQL开始。是的,我忘记了
选择u
只是一个注释,如果我们将
@OneToMany
mappedBy
一起使用,Hibernate默认使用
@JoinColumn
。@qizer它提醒您应该接受帮助您的答案。您好,感谢您的回复。在我的情况下,两个查询都是正确的,但您的答案是p向我提供了有用的信息。此外,我对“角色”实体有疑问。我已经了解到
@OneToMany
必须是一个集合(Set)。我可以对代码进行任何更改,而不是
Set user
使用
用户用户
(无集合)?@qizer No.你需要一个集合来收集
@OneToMany
关联-
集合
列表
。我更新了我的答案。@v.ladynev+1建议使用
@ManyToMany
关联。但是为什么
用户
类中的
角色
不是
列表
集合
?@v.ladynev很好的建议,但是w根据您的建议,我收到:
原因:org.hibernate.AnnotationException:非法尝试将非集合映射为@OneToMany、@ManyToMany或@collectionfelments:com.example.jpa.model.User.role
。如果我设置集合
私有集角色
我会看到
org.hsqldb.hsqldb异常:用户缺少权限或找不到对象:User_角色
我不推荐这种方法,另外,它不使用连接。
@Entity
@Table(name = "role")
public class Role {

@Id
@Column(name = "id")
private long id;

@Column(name = "name", length = 45)
private String name;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "role")
private Set<User> user = new HashSet<>();

//getters and setters
}
public interface UserRepository extends JpaRepository<User, Long> {

String Q_GET_ALL_USERS = "select u from User u left join u.role";

@Query(Q_GET_ALL_USERS)
Collection<User> getAllUsers();
}
@Entity
@Table(name = "sys_std_user")
public class StdUser {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "class_id")
    public int classId;
    @Column(name = "user_name")
    public String userName;
}

@Entity
@Table(name = "sys_std_profile")
public class StdProfile {
    @Id
    @Column(name = "pro_id")
    public int proId;
    @Column(name = "full_name")
    public String fullName;
}
@PersistenceUnit
private EntityManagerFactory emf;

@GetMapping("/join")
    public List actionJoinTable() {
        EntityManager em = emf.createEntityManager();
        List arr_cust = em
                .createQuery("SELECT u.classId, u.userName, p.fullName FROM StdUser u, StdProfile p WHERE u.classId=p.proId")
                .getResultList();
        return arr_cust;
    }
[
    [
        1,
        "Ram",
        "Ram Pukar Chaudhary"
    ],
    [
        2,
        "Raja",
        "Raja Kishor Shah"
    ]
]