EnumSet class,在运行时获取元素类型
EnumSet class, get element type at runtime
我正在尝试扩展 https://github.com/tennaito/rsql-jpa 库以支持 EnumSet 字段。
如果我对 ArgumentParser 进行硬编码以将 EnumSet 属性值转换为特定查询,那么我就可以针对数据库进行实际查询。
我的问题是给定一个查询 enumsetfield=IN=(enumvalue)
ArgumentParser 得到一个 JavaType:class java.util.EnumSet
和字符串枚举值。
如何从 JavaType 获取元素类型?如果可能包含 elementType,我也可以访问 org.hibernate.jpa.criteria.path.SingularAttributePath
。
我最终在 SingularAttributePath 上找到了所需的信息:path.attribute.member.signature
其形式为:Ljava/util/EnumSet<Lmy.project.enum;>;
- 这不是最优的,我不得不大量重写 rsql-jpa,并且我最终意识到 IN 查询对于比较两个集合毫无意义。所以现在的查询是 enumsetfield==enumvalue
您可以使用反射来获取 EnumSet
class 中存储元素 class 的非 public 字段。例如,对于 OpenJDK 8,here 是 EnumSet
的源代码,元素 class 的字段称为 elementType
。但是,这将是特定于您的 class 库实现的实现,而不是可移植的。
我正在尝试扩展 https://github.com/tennaito/rsql-jpa 库以支持 EnumSet 字段。
如果我对 ArgumentParser 进行硬编码以将 EnumSet 属性值转换为特定查询,那么我就可以针对数据库进行实际查询。
我的问题是给定一个查询 enumsetfield=IN=(enumvalue)
ArgumentParser 得到一个 JavaType:class java.util.EnumSet
和字符串枚举值。
如何从 JavaType 获取元素类型?如果可能包含 elementType,我也可以访问 org.hibernate.jpa.criteria.path.SingularAttributePath
。
我最终在 SingularAttributePath 上找到了所需的信息:path.attribute.member.signature
其形式为:Ljava/util/EnumSet<Lmy.project.enum;>;
- 这不是最优的,我不得不大量重写 rsql-jpa,并且我最终意识到 IN 查询对于比较两个集合毫无意义。所以现在的查询是 enumsetfield==enumvalue
您可以使用反射来获取 EnumSet
class 中存储元素 class 的非 public 字段。例如,对于 OpenJDK 8,here 是 EnumSet
的源代码,元素 class 的字段称为 elementType
。但是,这将是特定于您的 class 库实现的实现,而不是可移植的。