Hibernate 使用动态参数休眠多连接

Hibernate 使用动态参数休眠多连接,hibernate,join,parameters,criteria,Hibernate,Join,Parameters,Criteria,我想获得具有零到多个参数的多连接查询的结果集,我在SQL中的查询如下: SELECT c.* FROM users u INNER JOIN user_roles ur ON u.username = ur.username INNER JOIN customer c ON u.username = c.customer_id; 下图显示了表之间的关系; 定义如下的实体: @Entity @Table(name = "users") public class Use

我想获得具有零到多个参数的多连接查询的结果集,我在SQL中的查询如下:

    SELECT c.*
      FROM users u
INNER JOIN user_roles ur ON u.username = ur.username
INNER JOIN customer   c  ON u.username = c.customer_id;
下图显示了表之间的关系;

定义如下的实体:

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column(name = "username", unique = true, nullable = false, length = 45)
    private String username;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    private Customer customer;

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

    //getter & setters
}


@Entity
@Table(name = "CUSTOMER")
public class Customer {
    @Id
    @Column(name = "customer_id")
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen",
            strategy = "foreign", parameters = @Parameter(name = "property", value = "user"))
    private String id;

    @OneToOne
    @PrimaryKeyJoinColumn
    private User user;

    //getter & setters
}

@Entity
@Table(name = "user_roles")
public class UserRole {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "user_role_id", unique = true, nullable = false)
    private Integer userRoleId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "username", nullable = false)
    private User user;

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

    //getter & setters
}
@实体
@表(name=“users”)
公共类用户{
@身份证
@列(name=“username”,unique=true,nullable=false,length=45)
私有字符串用户名;
@OneTONE(mappedBy=“user”,cascade=CascadeType.ALL)
私人客户;
@OneToMany(mappedBy=“user”,cascade=CascadeType.ALL)
私有集userRole=newhashset(0);
//接球手和接球手
}
@实体
@表(name=“客户”)
公共类客户{
@身份证
@列(name=“customer\u id”)
@生成值(generator=“gen”)
@GenericGenerator(name=“gen”,
strategy=“foreign”,parameters=@Parameter(name=“property”,value=“user”))
私有字符串id;
@奥内托内
@PrimaryKeyJoinColumn
私人用户;
//接球手和接球手
}
@实体
@表(name=“用户角色”)
公共类用户角色{
@身份证
@生成值(策略=标识)
@列(name=“user\u role\u id”,unique=true,nullable=false)
私有整数userRoleId;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“username”,nullable=false)
私人用户;
@列(name=“role”,nullable=false,length=45)
私有字符串角色;
//接球手和接球手
}
我已经读到你可以用一个标准来连接列,但是我没有成功。我怎样才能做到呢?

我得到了答案:

        Criteria criteria = session.createCriteria(UserRole.class,"userRole")
                            .createCriteria("user","user")
                            .createCriteria("customer","customer");
        criteria.add(Restrictions.eq("user.enabled", enabled));

        if(userName!=null){
            criteria.add(Restrictions.eq("user.username", userName));
        }if(role!=null){
            criteria.add(Restrictions.eq("userRole.role", role));
        }if(fName!=null){
            criteria.add(Restrictions.eq("customer.customerFirstname", fName));
        }if(lName!=null){
            criteria.add(Restrictions.eq("customer.customerLastname", lName));
        }
        List<UserRole> results = criteria.list();
Criteria=session.createCriteria(UserRole.class,“UserRole”)
.createCriteria(“用户”、“用户”)
.createCriteria(“客户”、“客户”);
添加(Restrictions.eq(“user.enabled”,enabled));
如果(用户名!=null){
添加(Restrictions.eq(“user.username”,username));
}if(角色!=null){
添加(Restrictions.eq(“userRole.role”,role));
}如果(fName!=null){
添加(Restrictions.eq(“customer.customerFirstname”,fName));
}如果(lName!=null){
添加(Restrictions.eq(“customer.customerLastname”,lName));
}
列表结果=标准。列表();