JPA加入特定领域

时间:2015-09-29 13:11:22

标签: java hibernate jpa join specifications

我有这种情况:

用户及其相关的 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_

2 个答案:

答案 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