2009-11-03 4 views
1

У меня есть запрос, который работает в простом SQL, но не работает с JPA и не может понять, почему. Как вы можете догадаться из названия, у меня есть ключ, но я не знаю, как его «исправить».JPA join column с нулевыми значениями

Вот фактический важный код:

@Id 
@Basic(optional = false) 
@Column(name = "id", nullable = false) 
private Integer id; 

@Basic(optional = false) 
@Column(name = "read_permission", nullable = false) 
private boolean readPermission; 

@Basic(optional = false) 
@Column(name = "write_permission", nullable = false) 
private boolean writePermission; 

@Basic(optional = false) 
@Column(name = "execute_permission", nullable = false) 
private boolean executePermission; 

@Basic(optional = false) 
@Column(name = "admin_permission", nullable = false) 
private boolean adminPermission; 

@JoinColumn(name = "xinco_core_data_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreData xincoCoreDataId; 
@JoinColumn(name = "xinco_core_group_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreGroup xincoCoreGroupId; 

@JoinColumn(name = "xinco_core_node_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreNode xincoCoreNodeId; 

@JoinColumn(name = "xinco_core_user_id", referencedColumnName = "id", nullable=true) 
@ManyToOne(fetch = FetchType.LAZY) 
private XincoCoreUser xincoCoreUserId; 

А вот работает SQL:

select * from xinco_core_ace where xinco_core_user_id = 1 order by xinco_core_user_id, xinco_core_node_id, xinco_core_data_id; 

И вот что я пытаюсь сделать:

SELECT xca FROM XincoCoreAce xca WHERE xca.xincoCoreUserId.id = 1 ORDER BY xca.xincoCoreUserId.id, xca.xincoCoreGroupId.id, xca.xincoCoreNodeId.id, xca.xincoCoreDataId.id 

вопрос, Я думаю, что xca.xincoCoreUserId.id, xca.xincoCoreGroupId.id, xca.xincoCoreNodeId.id, xca.xincoCoreDataId.id могут быть nul левая сторона

Любая идея? Надеюсь, легче читать: P

+0

Вообще говоря, выполнение дампа кода в вопросе - плохая идея. Вы должны сократить этот код до минимума, чтобы продемонстрировать проблему. Если это облегчает чтение и понимание (и, следовательно, это гораздо более вероятно, чтобы читать и отвечать), и, если ничего другого, это демонстрирует, что вы приложили некоторые усилия. Cheers. – cletus

+0

Спасибо за отзыв, это всего лишь мой второй вопрос и первый со связанным кодом. надеюсь, сейчас чище. – javydreamercsw

ответ

1

Также случился со мной с более простым запросом:

select t from Task t where t.worker is not null order by t.worker.normalizedName 

Найден, что любая задачей результатом лицо, в котором рабочий атрибуте является нулевым (задача Unassigned) будет отброшено. Позже я узнал, что это связано с тем, что навигация по траекториям в JPA выполняется с использованием внутренних соединений (спецификация говорит так), и это исключает любой результат, когда часть пути равна нулю.

В этом отчете об ошибке четко описывается проблема :

https://bugs.eclipse.org/bugs/show_bug.cgi?id=363798

к сожалению, это не ошибка реализации и вам придется реорганизовать свои объекты/запросы, чтобы избежать такого рода ситуаций.

0

Я не эксперт по JPA, но я бы попытался получить фактический SQL, который запускается в базе данных. Может быть, FetchType.LAZY имеет какое-то отношение к этой проблеме?

+0

Если вы используете Hibernate в качестве своего поставщика JPA, вы можете посмотреть http://www.javalobby.org/java/forums/t44119.html Это немного устарело, поэтому я надеюсь, что он все еще работает. – kovica

+0

Я использую EclipseLink, но я все равно посмотрю. – javydreamercsw

+0

Это фактический запрос (с использованием журнала eclipselink): SELECT t1.id, t1.write_permission, t1.admin_permission, t1.execute_permission, t1.read_permission, t1.xinco_core_user_id, t1.xinco_core_data_id, t1.xinco_core_group_id, t1.xinco_core_node_id FROM xinco_core_data t4, xinco_core_node t3, xinco_core_group t2, xinco_core_ace t1, xinco_core_user t0 WHERE ((t3.id =?) AND (((t3.id = t1.xinco_core_node_id) И (t0.id = t1.xinco_core_user_id)) И (t2.id = t1.xinco_core_group_id)) И (t4.id = t1.xinco_core_data_id))) ORDER BY t0.id ASC, t2.id ASC, t3.id ASC, t4.id ASC bind => [1] – javydreamercsw

1

Это фактический запрос делается (с помощью протоколирования EclipseLink):

SELECT t1.id, t1.write_permission, t1.admin_permission, t1.execute_permission, t1.read_permission, t1.xinco_core_user_id, t1.xinco_core_data_id, t1.xinco_core_group_id, t1.xinco_core_node_id FROM xinco_core_data t4, xinco_core_node t3, xinco_core_group t2, xinco_core_ace t1, xinco_core_user t0 WHERE ((t3.id = ?) AND ((((t3.id = t1.xinco_core_node_id) AND (t0.id = t1.xinco_core_user_id)) AND (t2.id = t1.xinco_core_group_id)) AND (t4.id = t1.xinco_core_data_id))) ORDER BY t0.id ASC, t2.id ASC, t3.id ASC, t4.id ASC bind => [1] 

По какой-то причине, имеющее Поручение добавляет много таблицы перепроверки, в котором имеющие обнуляет сделать результат выйти пустой.

Удаление заказа путем получения требуемого результата (из-за заказа, конечно).

Смотреть это EclipseLink bug

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