2016-02-04 1 views
3

После поиска я узнал, что в JPQL нет права Присоединиться к JPQL. Я видел, что есть другой способ добиться этого, используя JPA двунаправленный (не правильно присоединяйся, но используя объект pojo), но одна вещь, которую я заметил в консоли, что он делает много вызовов в базе данных, например, см. Ниже таблицу.JPQL Right Присоединиться

 Flat Table     UserToFlat     User 
| Flat_ID | Flat No |  | ID | Flat_ID | User_ID | | User_ID | Name | 
| 1  | 101 |  | 1 | 1  | 1  | | 1  | XYZ | 
| 2  | 102 |  | 2 | 2  | 2  | | 2  | PQR | 
| 3  | 103 |  | 3 | 3  | 3  | | 3  | ABC | 
| 4  | 104 | 

Я хочу, чтобы все строки из плоской таблицы и только совпадающие строки из таблицы User

// below query do not work as flat is having primary key and usertoflat having foreign key 
select f, u from FlatEntity f left join f.userToFlatEntity uf join uf.user u; 

// now if I try right join then jpql throws exception 
select f from UserToFlatEntity uf right join uf.flatEntity f; 

Теперь, если я использую jpql birectional и приведи с помощью объекта для например

// suppose I have FlatEntity Object 
flatEntity.getUserToFlatEntity(); 

выше код будет попадает в базу данных для каждой квартиры нет, где условие flat_ID =? (4 раза в этом случае), и я думаю, что это не очень хорошая производительность.

Итак, можно ли каким-либо образом JPQL добиться правильного соединения без эффекта.

Объект Конфигурация

public class FlatEntity { 
    @OneToOne(mappedBy = "flatEntity") 
    private UserToFlatEntity userToFlatEntity; 

    // getter setter 
} 

public class UserToFlatEntity { 
    @ManyToOne 
    @JoinColumn(name = "flatId", insertable = false, updatable = false) 
    private FlatEntity flatEntity; 
} 

public class UserEntity { 
    @OneToMany(mappedBy = "userEntity") 
    private Set<UserToFlatEntity> userToFlatEntitySet; 
} 

Exception 
Path expected for join! 
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:369) 
+0

Там находится прямо присоединиться JPQL. –

+0

@DraganBozanovic Не могли бы вы привести мне пример, потому что я получаю ошибку. Я отправляю конфигурацию отображения. – pise

+0

Я не вижу каких-либо предложений 'from' в ваших запросах. Сначала я предлагаю вам пройти несколько учебных пособий по Hibernate/JPA. –

ответ

1

Вы должны сделать Плоский стол стороной владельца отношений (что делает более логичным смысл ИМО). Затем вы можете использовать ЛЕВОЙ ВСТУПИТЕЛЬ, а не ПРАВОЕ СОЕДИНЕНИЕ.

SELECT uc, MAX(ua.accessTs) FROM Flat Table uc LEFT JOIN uc.User Table ua 

Here's why left join on UserTable works:

для более детальной информации посетите здесь: RIGHT JOIN in JPQL

enter image description here

0

RRIGHT JOINS ака RRIGHT OUTER JOINS такое же, как

SLEFT JOINR ака SLEFT OUTER JOINR.

0

Вы не найдете (рабочие) примеры правого соединения в JPQL. Как уже упоминалось в этом документе EclipseLink forum post, спецификация JPA не включает правое соединение:

Спецификация JPA определяет только левое внешнее соединение. Не стесняйтесь подавать EclipseLink или запросить его включение в спецификацию JPA .

Возможно, вы можете прибегнуть к помощи native query?