2017-06-21 99 views
0

考慮這個類:春數據JPA加入子查詢

@Entity 
@Table(name = "USER_TABLE") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class User { 

    @Id 
    @GenericGenerator(name = "system-uuid", strategy = "uuid2") 
    @GeneratedValue(generator="system-uuid") 
    @Column(name = "id", unique = true) 
    @Type(type= "org.hibernate.type.PostgresUUIDType") 
    private UUID id; 

    @Column(name = "USERNAME") 
    private String userName; 
} 

和單純的孩子:

@Entity 
@Table(name = "CUSTOMER") 
public class Customer extends User{ 
     //some extra fields 
} 

我有關係到用戶的另一個類:

@Entity 
@Table(name = "USER_ACTIVITY") 
public class UserActivity { 

    @ManyToOne 
    @JoinColumn(name = "USERID") 
    private User user; 

    //id and other fields 
} 

這是棘手的部分。我想獲取與「客戶」相關的UserActivity類型的所有對象。我試過這樣的:

public interface UserActivityRepository extends PagingAndSortingRepository<UserActivity,UUID> { 
    @Query("select u from UserActivity u join Customer.id") 
    List<UserActivity> findAllByUserIsNotNullOrderByCreatedDesc(Pageable pageable); 
} 

但hibernate告訴我,我指定了一個無效的路徑。

你能幫我解答嗎?

回答

1

您可以Customer或過濾器由屬於Customer IDS User IDS明確加入:

  1. select u from UserActivity u, Customer c where u.user.id = c.id
  2. select u from UserActivity u where u.user.id in (select id from Customer)

選擇任何你喜歡的更好,因爲在現代數據庫優化會優化兩個查詢,以便兩種情況下的性能都相同。

0

在您的User實體中使用@DiscriminatorColumn(name = "TYPE")

@Entity 
@Table(name = "USER_TABLE") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "TYPE") 
@DiscriminatorValue("USER") 
public class User { 

    ... 

} 

Customer實體

@Entity 
@Table(name = "CUSTOMER") 
@DiscriminatorValue("CUSTOMER") 
public class Customer extends User { 

    ... 

} 

查詢您的存儲庫定義@DiscriminatorValue("CUSTOMER")像這樣

@Query("select u from UserActivity u join u.user user where TYPE(user) = 'CUSTOMER'") 
List<UserActivity> findAllByUserIsNotNullOrderByCreatedDesc(); 

注:@DiscriminatorValue註釋並不是強制性的。 JPA根據實體類型推斷列名。

+0

類型取實體名稱,而不是DiscriminatorValue。 https://stackoverflow.com/questions/3765948/how-do-i-query-for-only-superclass-entities-in-a-jpql-query – Chris

+0

是的。這就是爲什麼'TYPE(用戶)'。用戶是映射的實體。 –

+0

供應商支持它很棒,但JPA需要實體類作爲輸入參數,將鑑別器列中使用的值分開,或者甚至用於確定您正在尋找的實際類型的類中使用的機制。您對該類型的回答是正確的,但您無需指定Discriminator註釋,只需使用該類即可。 – Chris