当我尝试使用MutableAclService.createAcl(ObjectIdentity objectIdentity).
问题是ObjectIdentity使用Serializable类型作为标识符。同时,我的域String为此目的使用类型。Id 以这种方式生成:
String id = UUID.randomUUID().toString();
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下结构添加 ACL:
ObjectIdentity identity = new ObjectIdentityImpl(clazz, id);
aclService.createAcl(identity);
Run Code Online (Sandbox Code Playgroud)
之后,我收到以下异常:
java.lang.NumberFormatException:对于输入字符串:“ad169805-a2d1-4324-ba11-c98cc679e594”
我发现 Spring Security ACL 使用Long类型作为标识符。
所以,问题是:
Serializable到处都提到,但实际上它必须很长?PS 标识符的 SQL 数据类型也是数字 - bigserial。
面临在选择条件的地方使用列别名的需要.找到可行的解决方案在这里.
假设我们有一对一的关系(用户到角色),我们希望获得如下结果:
SELECT u.name AS u_name, r.name AS r_name
FROM users AS u
INNER JOIN roles AS r
ON u.role_id = r.role_id
WHERE u.name = 'John'
Run Code Online (Sandbox Code Playgroud)
我们有相应的idex user.name(仅举例).
如果运行此查询EXPLAIN,则显示选择期间使用的所有索引(包括名称索引).
现在,因为我们想在WHERE子句中使用别名,基于提出的解决方案,我们可以重写查询:
SELECT * FROM (
SELECT u.name AS u_name, r.name AS r_name
FROM users AS u
INNER JOIN roles AS r
ON u.role_id = r.role_id
) AS temp
WHERE u_name = 'John'
Run Code Online (Sandbox Code Playgroud)
如您所见,WHERE嵌套选择中没有子句.运行此查询EXPLAIN会得到相同的结果(只是承认,我不是分析'解释'结果的专家,但仍然):
我对此结果感到有点困惑:确信至少不会使用用户名索引.
Q1: postgres是否以这种方式使用索引?
Q2: …