提问人:Rollermix 提问时间:11/17/2023 更新时间:11/17/2023 访问量:24
实体的 JPA 动态字段
JPA dynamic fields of Entity
问:
我有带有品牌、型号和尺寸字段的 Object Laptop 以及另外 12 个字段 是否可以使用 JPA 构建带有动态设置字段的查询? 例如 “从笔记本电脑选择 param1” 其中 param1 可以是品牌、型号、尺寸等
答:
0赞
eturella
11/17/2023
#1
如果您必须提取字段的不同值,请检查此问题:如何使用 JPA 和 Spring 在列表中查找带有字段的不同行?
即使您需要读取实体的单个字段,也可以像加载一部分一样快地加载整个字段,因为网络传输时间远小于磁盘访问时间。你最终可以使用 stream().map(Lapto::getParam1)
出于其他原因,您必须使用涉及 EntityManager 的原始解决方案。getCriteriaBuilder()
(尽量更具体)
评论
0赞
David Weber
11/17/2023
网络传输时间通常不会比磁盘访问时间快。这取决于您的连接。迭代列表中的 20000 多个项目可能比执行仅返回所需值的简单 Webrequest 慢,是的,但即使这样也取决于连接。数据库调用非常昂贵。
0赞
Rollermix
11/17/2023
我的解决方案: 查询 q = entityManager.createNativeQuery(“Select ” +param1 +sep+param2+sep+param3+sep+ param4+sep+ param5+ “ From Laptop”);其中 params 是方法参数,sep 是分隔符:)谢谢
0赞
rentox98
11/17/2023
#2
您可以在存储库界面中创建新的自定义方法(您将调用该方法以执行查询),并且您有以下几个选项:
- 您可以选择通过连接 select 语句来构造“手工制作”字符串。但是,对 SQL 注入威胁保持谨慎至关重要:
“选择”+参数1+“从表中”
随后,您可以将字符串提供给存储库中的 @Query 注释,以使用 SQL 生成本机查询
@Query(value = "Here goes the string", nativeQuery = true)
- 您可以通过利用特定 API(例如条件 API)来探索更深入的功能
P.S. 我不知道您的请求背后的具体原因,但实际上,如果您的记录字段很少并且不太复杂,您可以轻松地保留检索整个对象的查询,然后处理您感兴趣的字段。
上一个:我不能那个神器 [复制]
评论