2015-06-03 6 views
2

У меня есть Entity1 и Entity2. У них есть одноразовая связь OneToOne.Запрос отношения nullable @OneToOne с JPA

@Entity 
class Entity1 { 

    @Id 
    @Column(name = "id") 
    private Long id; 

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity2") 
    @JoinColumn(nullable = true)  
    private Entity2 entity2; 
    ... 
} 

Как я могу запросить все Entity1 объекты, имеет нуль entity2?

Потому что, если я делаю:

SELECT e FROM Entity1 e WHERE e.entity2 IS NULL 

JPA двигатель сделать JOIN между двумя таблицами и положить бесполезную WHERE clausule (WHERE entity_id = NULL). Возобновление, он выполняет бесполезный родной SQL. Как можно

Текущее решение:

Чтение документации OpenJPA, я обнаружил, что коренные запросы должны быть использованы для обхода ограничений JPA. Я могу сделать это очень легко, используя собственный запрос, и сейчас я это делаю, но я бы хотел избежать использования этого.

+0

Можете ли вы дать более конкретные сведения о том, как эти Сущности связаны друг с другом? Вы используете метод связывания @ @ JoinColumn или 'mappedBy', или, возможно, это' @ PrimaryKeyJoinColumn'? – DuncanKinnear

+0

Я добавил его в код. –

ответ

3

Вы можете просто запустить этот JPQL запрос:

SELECT e1 
FROM Entity1 e1 
LEFT JOIN e1.entity2 e2 
WHERE e2 IS NULL 

LEFT JOIN является то, что вы искали.

+0

Это сработало. Вы изучили это чтение какой-либо специальной документации? Я хотел бы понять это лучше. –

+0

Это стандартный SQL. Любой [учебник по SQL] (http://www.w3schools.com/sql/), вероятно, охватит это. –

+0

Я говорил о JPQL. В SQL я сделал правильно. –

1

Да, это может быть сделано без выполнения соединения и использования запроса JPA. Проверьте следующий фрагмент кода:

@Entity 
class Entity1 { 
    ... 
    @OneToOne(...) 
    @JoinColumn(name="entity2ID") 
    private Entity2 entity2; 
    @Column(name="entity2ID", nullable="true", insertable="true", updatable="true") 
    private Long entity2ID; 
    ... 
} 

Просто карта, соединяющий столбец в сущности, как Вставляемые/обновляемой ЛОЖЬ. Убедитесь, что вы абсолютно не предоставляете метод настройки для столбца xyz или соединения. Как только это будет сделано, вы можете использовать следующий запрос:

SELECT e FROM Entity1 e WHERE e.entity2ID IS NULL 

Это не будет выполнять все присоединяется, как вы запрашиваете для соединения колонки непосредственно.

+0

Хорошее решение, но я думаю, что ответ Влада прост в обслуживании. –

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