2015-09-10 2 views
2

У меня есть две сущности:JPA рассчитывать связанные объекты без присоединения к ним

@Entity 
class X { 
    @Id 
    int id; 
} 

@Entity 
class Y { 
    @Id 
    int id; 

    @ManyToOne 
    @JoinColumn(name = "x_id") 
    X x; 
} 

Я хотел бы рассчитывать различные значения x_id в у стола. Я пробовал:

select count(distinct Y.x) from Y; 

Это работает, но в SQL я получаю присоединиться к й таблице, которая uneccesery:

select count(distinct x.id) from y, x where y.x_id = x.id; 

Это соединение является ненужным и довольно дорого для меня. Есть ли способ избежать этого без собственного запроса?

+0

Обратите внимание, что ответ здесь может быть реализации- зависимый. Например, Hibernate может генерировать более эффективный запрос. – chrylis

+0

Я боялся этого. Я использую eclipselink – Matzz

+0

Решение JPA заключается в том, что если вы не хотите присоединиться к таблице X, не сопоставляйте его как отношения. Вы отобразите внешний ключ «x_id» как базовый для использования в запросах без объединения. EclipseLink также имеет ключи запроса, которые могут быть созданы для использования поля в запросах в качестве базового сопоставления, чтобы вы могли точно контролировать, что вы хотите, ты хочешь это. Что касается этого запроса, какую версию вы используете? – Chris

ответ

1

Вы можете попробовать select count(distinct Y.x.id) from Y (T.x.id вместо Y.x). Я не уверен, но интеллектуальная реализация JPA должна выяснить, что нужен только идентификатор и не будет добавлять соединение.

Альтернатива заключается в добавлении Int поле в Y с только для чтения отображения на x_id колонка:

@Entity 
class Y { 
    @Id 
    int id; 

    @ManyToOne 
    @JoinColumn(name = "x_id") 
    X x; 

    @Column(name = "x_id", insertable = false, updatable = false, nullable = false) 
    int xId; 
} 

И ваш запрос будет просто select count(distinct Y.xId) from Y

+0

Работает как шарм. Я не понимал, что я могу сопоставить один столбец с несколькими полями. Благодаря! – Matzz

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