Spring security 带Spring安全性的SpEL格式化查询Spring数据JPA

Spring security 带Spring安全性的SpEL格式化查询Spring数据JPA,spring-security,spring-data-jpa,Spring Security,Spring Data Jpa,我有一个Spring数据JPA实体 @Entity public class User { private static final long serialVersionUID = 1L; @Id private Long id; 我想包括一个属性mutualFriends,它是针对Spring Security中的查询用户原则进行查询的结果,使用SpEL和?: 根据SpEL示例,我提出了如下内容: @Formula("select count(frien

我有一个Spring数据JPA实体

@Entity    
public class User  {

    private static final long serialVersionUID = 1L;

    @Id
    private Long id;
我想包括一个属性mutualFriends,它是针对Spring Security中的查询用户原则进行查询的结果,使用SpEL和?:

根据SpEL示例,我提出了如下内容:

@Formula("select count(friendship) from Friendship friendship where " +
        "friendship.owner.id = id " +
        "and friendship.friend in " +
        "(SELECT f.friend FROM Friendship f where f.owner.id = " +
        "?#{principle != null ? principal.id : id}) ")
    private Integer mutualFriends;
验证用户时使用相同的实体用户,因此我需要有一些逻辑来确定原则是否可用,或者我得到一个错误:

原因:org.postgresql.util.PSQLException:未为指定值 参数2

这个格式正确吗

下面是当我得到异常时执行的hibernate查询的相关部分:

select user0_.id as id1_19_, user0_.created_by as created_2_19_, user0_.created_date as created_3_19_, user0_.last_modified_by as last_mod4_19_, user0_.last_modified_date as last_mod5_19_, user0_.activated as activate6_19_, user0_.activation_key as activati7_19_, user0_.avatar_url as avatar_u8_19_, user0_.banner_url as banner_u9_19_, user0_.description as descrip10_19_, user0_.email as email11_19_, user0_.first_name as first_n12_19_, user0_.lang_key as lang_ke13_19_, user0_.last_name as last_na14_19_, user0_.login as login15_19_, user0_.online as online16_19_, user0_.password_hash as passwor17_19_, user0_.reset_date as reset_d18_19_, user0_.reset_key as reset_k19_19_, user0_.test_data as test_da20_19_, 
选择countuser0 来自友谊 朋友在哪里 选择f.friend 来自友谊f 其中f.owner.id=COALESCE?{principle!=null?principal.id:user0\uu0.null},user0\u0.id 而Friendly.owner.id=user0\uu.id作为公式2\u 来自用户user0,其中user0.login=


SpEL/JPA正确地实现了将id替换为user0\u0.id,但是仍然缺少一些东西?另外,似乎没有从友谊中选择countuser0.friendship friendship where friendship.friendship中选择f.friendship friendship f where f.owner.id=COALESCE?{principle!=null?principal.id:user0_2;.null},user0\u0.id和friendy.owner.id=user0\u0.id作为查询的公式2\u2部分已正确解析?

我认为问题可能是在SpEL上下文中id未知。将SpEL表达式替换为

COALESCE(?#{principle != null ? principal.id : null},id)

应该这样做。

对不起,完全忽略了显而易见的:

@配方奶粉是一种冬眠的东西。它对SpEL一无所知,因此无法计算这些表达式


您所能做的,以及您链接到的示例所做的是:在存储库中创建一个方法,添加@Query注释并在其中使用SpEL

试一试,同样的结果在整个应用程序中的许多地方,用户实体链接到其他实体,我不需要重新运行@Query方法来获取结果吗?或者我可以直接将@Query添加到@Entity注释类中吗?您可以在实体上放置命名查询,但这也是JPA功能,不支持SpEL。
COALESCE(?#{principle != null ? principal.id : null},id)