我有这种情况:
用户及其相关的 UserRole 实体类,如下所示:
body,html {
margin: 0;
padding: 0;
-webkit-font-smoothing: antialiased;
height: 100%;
width: 100%;
overflow: hidden }
textbox {
width: 100%;
height: 42px;
padding: 20px 0px 25px 25px;
border: 0px;
outline: none;
-webkit-font-smoothing: antialiased;
-webkit-appearance: none;
position: absolute;
bottom: 0px; }
和
@Entity
@Table(name="USER")
public class User implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID", unique=true, nullable=false)
private int id;
@Column(name="USERNAME", unique=true, nullable=false, length=255)
private String username;
@OneToMany(mappedBy="user")
private List<UserRole> userRoles;
}
现在,我需要查询具有特定角色的所有用户。我正在尝试加入JPA规范,就像那样:
@Entity
@Table(name="user_roles")
public class UserRole implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="user_role_id", unique=true, nullable=false)
private int userRoleId;
@Column(nullable=false, length=45)
private String role;
@ManyToOne
@JoinColumn(name="username", nullable=false)
private User user;
}
问题是生成的联接将介于用户。 ID 和UserRole。用户名之间,查询显然没有结果。
Join<User, UserRole> join = root.join(User_.userRoles);
Expression<String> match = join.get(UserRole_.role);
Predicate predicate = builder.equal(match, "ROLE_USER");
我需要在用户名字段中使用on子句:
select count(user0_.ID) as col_0_0_ from USER user0_ inner join
user_roles userroles1_ on user0_.ID=userroles1_.username where
userroles1_.role='ROLE_USER'
我注意到Join类的 .on 方法是:
修改连接以根据指定的ON限制结果 条件。替换先前的ON条件(如果有)。返回加入 对象
这是正确的做法吗?如果是这样,我该如何实现呢?
... from USER user0_ inner join
user_roles userroles1_ on user0_.USERNAME=userroles1_.username ...
提前谢谢。
更新:
Join<User, UserRole> join = root.join(User_.userRoles).on(????);
元模型类
UserRole_
@StaticMetamodel(UserRole.class)
public class UserRole_ {
public static volatile SingularAttribute<UserRole, Integer> userRoleId;
public static volatile SingularAttribute<UserRole, String> role;
public static volatile SingularAttribute<UserRole, User> user;
}
元模型类:
User_
答案 0 :(得分:3)
您需要使用referencedColumnName
:
@ManyToOne
@JoinColumn(name="username", referencedColumnName="username", nullable=false)
private User user;
仅使用@JoinColumn(name="username")
告诉Hibernate user_roles
中的连接列名为username
- 但它仍然期望它包含User的@Id
属性的值。如果为模式创建DDL,您将看到Hibernate为user_roles.username
生成一个数字列。
答案 1 :(得分:0)
再次,您应该检查user_roles.username列包含的内容,因为默认情况下,它包含引用实体的@Id
列,此处引用的实体是User,其@Id列是{{ 1}}(在您的架构中:id
)而非ID
(在您的架构中:username
)。
虽然,这里有一个如何编写你在此描述的内容的例子:
问题是生成的连接将在User.id和。之间 UserRole.username和查询显然没有结果。我需要 而是在用户名字段上都有on子句:
在JPQL中(使用JPA 2.1)
USERNAME