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"
]
]