求获取Salesforce已安装包名称、命名空间前缀及许可证ID的SOQL/Apex方案
获取Salesforce已安装包的名称、命名空间前缀及许可证ID
你提到的问题很常见——PackageLicense对象确实只存储了命名空间前缀和许可证ID,包的名称信息其实在InstalledPackage对象里。这两个对象通过NamespacePrefix字段关联,所以我们可以结合这两个对象来获取你需要的所有信息。
方法1:SOQL查询(直接关联)
如果你想直接通过SOQL查询获取关联数据,可以使用子查询来关联InstalledPackage和PackageLicense:
SELECT Name AS PackageName, NamespacePrefix, (SELECT Id AS PackageLicenseId FROM PackageLicenses) FROM InstalledPackage
这个查询会返回每个已安装包的名称、命名空间前缀,以及对应的所有包许可证ID。如果一个包有多个许可证(比如不同的许可类型或版本),子查询会列出所有相关的许可证ID。
方法2:Apex代码(扁平化结果)
如果需要将结果整理成一行对应一条许可证的格式(更方便后续处理),可以用Apex代码来遍历并组合两个对象的数据:
// 查询所有已安装包及其关联的许可证 List<InstalledPackage> installedPackages = [ SELECT Name, NamespacePrefix, (SELECT Id FROM PackageLicenses) FROM InstalledPackage ]; // 自定义列表存储整理后的结果 List<PackageDetail> packageDetails = new List<PackageDetail>(); for (InstalledPackage ip : installedPackages) { // 遍历当前包下的所有许可证,一一对应存储 for (PackageLicense pl : ip.PackageLicenses) { packageDetails.add(new PackageDetail( ip.Name, ip.NamespacePrefix, pl.Id )); } } // 自定义类用于封装结果 public class PackageDetail { public String packageName { get; set; } public String namespacePrefix { get; set; } public Id packageLicenseId { get; set; } public PackageDetail(String name, String nsPrefix, Id licenseId) { this.packageName = name; this.namespacePrefix = nsPrefix; this.packageLicenseId = licenseId; } } // 输出结果(可根据需求调整,比如返回给页面或存入自定义对象) System.debug('整理后的包信息:' + packageDetails);
注意事项
- 如果同一个命名空间存在多个
PackageLicense(比如测试许可证和正式许可证),上述代码会将每个许可证都单独列出,确保你不会遗漏任何许可证信息。 - 如果你只需要每个包的最新许可证,可以在子查询中添加过滤条件,比如
(SELECT Id FROM PackageLicenses ORDER BY CreatedDate DESC LIMIT 1)。
内容的提问来源于stack exchange,提问作者ravi shankar
相关产品推荐
相关产品推荐

