小编Dmi*_*kin的帖子

当我的域标识符为 String 类型时,如何使用 Spring Security ACL?

当我尝试使用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类型作为标识符。

所以,问题是:

  1. 在这种情况下,最佳实践是什么(例如,我是否需要使用对象的哈希码作为标识符,或者其他什么)?
  2. 为什么Serializable到处都提到,但实际上它必须很长?

PS 标识符的 SQL 数据类型也是数字 - bigserial。

java spring-security-acl

5
推荐指数
1
解决办法
565
查看次数

索引是用于'外部'和'内部'的嵌套选择中的子句吗?

面临在选择条件的地方使用列别名的需要.找到可行的解决方案在这里.

假设我们有一对一的关系(用户到角色),我们希望获得如下结果:

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: …

sql postgresql indexing select

2
推荐指数
1
解决办法
61
查看次数

标签 统计

indexing ×1

java ×1

postgresql ×1

select ×1

spring-security-acl ×1

sql ×1