我使用EclipseLink时遇到以下问题。
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.4</version>
我有一个UserEntity:
@Entity
@Table(name = TableNames.CC_Users)
public class UserEntity extends AbstractEntity {
@EmbeddedId
private UserId id;
....
@OneToOne (optional = true, orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumns({
@PrimaryKeyJoinColumn(name = Columns.vccIdCN, referencedColumnName = Columns.vccIdCN),
@PrimaryKeyJoinColumn(name = Columns.userIdCN, referencedColumnName = Columns.userIdCN)
})
private ClientUserEntity clientUser;
...
}
然后我有ClientUserEntity:
@Entity
@Table(name = TableNames.CC_Client_Users)
public class ClientUserEntity extends AbstractEntity {
@EmbeddedId
private UserId id;
...
}
UserId是一个包含2个字符串字段的嵌入:vccId和userId。
当我尝试使用以下JPQL获取不是ClientUser的用户时:
"SELECT us FROM " + UserEntity.class.getSimpleName() + " us LEFT JOIN us.clientUser cu WHERE us.id.vccId = :vccId AND cu IS NULL";
我在调试器中看到以下Query:
[EL Fine]: sql: ... --Thread(Thread[main,5,main])--SELECT ... t1.language, ... FROM cc_user t1 LEFT OUTER JOIN cc_client_user t0 ON ((t0.user_id = t1.user_id) AND (t0.vcc_id = t1.vcc_id)) WHERE (((t1.vcc_id IS NULL) AND (t1.user_id IS NULL)) AND (t1.vcc_id = ?))
第一个问题是JPA没有生成正确的SQL查询,它看起来像是JPQL查询而不是SQL。第二个问题是WHERE条件错误。 ((t1.vcc_id IS NULL)AND(t1.user_id IS NULL))这些字段是嵌入式ID的字段。我不明白为什么JPA会将这个条件添加到WHERE。也许这是一个不受支持的情况?
如果我使用不同的JPQL,会发生类似的事情:
"SELECT us FROM " + UserEntity.class.getSimpleName() + " us WHERE us.id.vccId = :vccId AND us.clientUser is null"
JPA生成:
SELECT ... FROM cc_user WHERE ((vcc_id = ?) AND ((vcc_id IS NULL) AND (user_id IS NULL)))
在这种情况下,它是一个SQL,但WHERE仍然是错误的。 看起来JPA不支持IS NULL情况的嵌入式id场景。
我希望SQL解释为here。
在这种情况下我应该使用Native Query吗?