2017-05-31 76 views
1

我对春季数据查询有问题。我想要接收用户已赋予角色的用户(列表)(角色在列表中)并且此用户(列表)的assignedOrders为空或此订单处于给定状态(State为枚举类)。春季数据异常查询

我想出了这样的查询:

List<User> findAllByRoleContainsAndOrdersAssignedStateIsNullOrOrdersAssignedStateEquals(State state,Role role); 

,但它并不在所有的工作。这是复杂的,我从来没有创建过这样的查询。你能帮助我吗?非常感谢 !

编辑: 的一段代码:

@Entity 
public class User implements Persistable { 
........... 
@Column(name = "ROLES") 
@Enumerated(EnumType.STRING) 
@ElementCollection(targetClass = Role.class) 
private List<Role> role; 
.......... 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "driver") 
private List<Order> ordersAssigned = new ArrayList<>(); 

} 
@Entity 
public class Order implements Persistable { 
........... 
@JoinColumn(name = "DRIVER_ID") 
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST) 
private User driver; 

@Column(name = "STATE") 
@Enumerated(EnumType.STRING) 
private State state; 
............. 

} 
+1

我觉得最好使用'@ Query'。 – Alex78191

回答

1

尝试是这样的:

@Entity 
public class User { 

    private String name; 

    @ElementCollection 
    @Column(name = "role") 
    private List<Role> roles = new ArrayList<>(); 

    @OneToMany(mappedBy = "user") 
    private List<Order> orders = new ArrayList<>(); 

    public User(String name, Role... roles) { 
     this.name = name; 
     this.roles.addAll(asList(roles)); 
    } 

    public enum Role { 
     ROLE1, ROLE2 
    } 
} 

@Entity 
public class Order { 

    private String title; 

    @ManyToOne 
    private User user; 

    private State state; 

    public enum State { 
     STATE1, STATE2 
    } 
} 

public interface UserRepository extends JpaRepository<User, Long> { 

    @Query("select distinct u from User u join u.orders o join u.roles r where r = ?1 and (o.state is null or o.state = ?2)") 
    List<User> getUsers(User.Role role, Order.State state); 
} 

工作example

更多的信息是herehere

+0

有用户包含订单包含单个状态的订单列表。我需要用户角色(角色列表中的一个)等于Role.DRIVER和assignedOrders(列表)为空或订单具有State.FINISHED的用户。 – Unlucky

+1

@Unlucky请向您的问题添加您需要的方法和界面(签名)。 – Cepr0

+0

对不起,它不完整。就是现在。 – Unlucky