2017-02-07 5 views
1

Я использую данные весны boot jpa 1.4, и я довольно новичок в этом. Определение моего стола - here. Его довольно просто, есть 2 таблицы (группы и пользователи).Внутреннее соединение в данных весенней загрузки jpa

  1. группа таблица содержит GROUP_ID (первичный ключ), GROUP_NAME, group_active (значения = Y/N). В таблице группы могут в идеале иметь только одну строку, которая имеет group_active к «Y», остальные должны иметь «N»

  2. пользователя таблица содержит user_id (первичный ключ), имя_пользователя, group_id (внешний ключ из группа).

Ниже приведены мои классы сущностей

Группа:

@Entity 
@Table(schema = "HR", name = "GROUPS") 
public class Group { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "GROUP_ID") 
    private Long id; 

    @Column(name = "GROUP_NAME") 
    private String name; 

    @Column(name = "GROUP_ACTIVE") 
    private String active; 

Пользователь:

@Entity 
@Table(schema = "HR", name = "USERS") 
public class User { 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "USER_ID") 
    private Long id; 

    @Column(name = "USER_NAME") 
    private String name; 

    @Column(name = "GROUP_ID") 
    private Long groupId; 

    @ManyToMany 
    @JoinTable(
     schema = "HR", 
     name = "GROUPS", 
     joinColumns = {@JoinColumn(table = "GROUPS", name = "GROUP_ID", insertable = false, updatable = false)}, 
     inverseJoinColumns = {@JoinColumn(table = "USERS", name = "GROUP_ID", insertable = false, updatable = false)} 
    ) 
    @WhereJoinTable(clause = "GROUP_ACTIVE='Y'") 
    private List<Group> group; 

Repository класс:

public interface UserRepository extends CrudRepository<User, Long>{   
    List<User> findByName (String name); 
} 

Запрос: Это запрос, я хочу выполнить, что является простым внутренним соединением.

SELECT U.* 
    FROM HR.USER U, HR.GROUP G 
    WHERE U.GROUP_ID=G.GROUP_ID 
     AND G.GROUP_ACTIVE='Y' 
     AND U.USER_NAME=? 

Что бы правильный способ, чтобы написать @JoinTable или @JoinColumn таким образом, что я всегда получаю обратно один пользователь, который принадлежит к активной группе с названием?

+0

возможность запускать 'FindAll()' в таблице пользователей Вы? –

ответ

0

Я сделал некоторые тесты, основанные на вашей настройки и решение нужно будет использовать фильтры (при условии, есть только одна группа с Group_Activity = «Y»):

Группа Entity

@Entity 
@Table(schema = "HR", name = "GROUPS") 
public class Group { 

    @OneToMany(mappedBy = "group") 
    @Filter(name = "activityFilter") 
    private Set<User> users; 

Entity Пользователь

@Entity 
@Table(schema = "HR", name = "USERS") 
@FilterDef(name="activityFilter" 
     , defaultCondition="group_id = 
       (select g.id from groups g where g.GROUP_ACTIVE='Y')") 
public class User { 

@ManyToOne 
@JoinColumn(name = "group_id") 
private Group group; 

Whe п сделать запрос

session.enableFilter("activityFilter"); 
session.createQuery("select u from Group g inner join g.users u where u.user_name = :userName"); 

Кроме, если есть много групп с активностью = 'Y', то попробуйте следующее:

@FilterDef(name="activityFilter" 
     , defaultCondition="group_id in 
       (select g.id from group g where g.GROUP_ACTIVE='Y')") 
+0

спасибо за ответ, но это не отношение OneToMany, потому что может быть более одного пользователя с тем же именем, но другого group_id. Следовательно, это может быть ManyToOne, но определенно не наоборот. –

+0

Право .. см. Мое решение для обновления –

+0

Я пробовал ваше предложение, но оно не работало. Вся цель использования Spring-boot-data-jpa состояла в том, чтобы избежать написания запросов и всего кода плиты котла.В любом случае, я пошел с пользовательским запросом в моем репозитории. Я уверен, что есть способ получить это без необходимости писать пользовательский запрос. –

Смежные вопросы