JPA EclipseLink SELECT可以为空的@OneToOne关系过滤WHERE关系为NULL

时间:2017-05-02 01:57:06

标签: jpa eclipselink

我使用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吗?

0 个答案:

没有答案