JPA 的动态查询好像并不能优雅地解决自定义返回实体类型的问题

2019-05-29 22:07:52 +08:00
 cccy0
Specification<User> specification = new Specification<User>() {
// @Override
// public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
// List<Predicate> predicateList = new ArrayList<>();
// Role role = roleRepository.findFirstById(2L);
// predicateList.add(criteriaBuilder.isNotNull(root.get("role")));
// predicateList.add(criteriaBuilder.equal(root.get("role").as(Role.class), role));
// String likeWord = "%" + "普通" + "%";
// predicateList.add(criteriaBuilder.like(root.get("name").as(String.class), likeWord));
// Predicate[] arrayType = new Predicate[predicateList.size()];
//
//// criteriaQuery.multiselect(root.get("name"), root.get("role"));
// criteriaQuery.select(root.get("name"));
// criteriaQuery.where(predicateList.toArray(arrayType));
// return criteriaQuery.getRestriction();
// }
// };



这种查询方式, 其实我是想让它返回 List<Map>这种类型来着。。。
3240 次点击
所在节点    问与答
9 条回复
c4f36e5766583218
2019-05-29 23:42:27 +08:00
cccy0
2019-05-31 10:09:25 +08:00
@c4f36e5766583218 #1 JPA 是 Java Persistence API 的简称,中文名 Java 持久层 API,是 JDK 5.0 注解或 XML 描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.*;
这些在 persistence 包下面的接口或抽象类, 都是 JPA 的规范

你说的那是 spring data jpa = =
c4f36e5766583218
2019-05-31 10:21:53 +08:00
你说的返回 List<Map> java.util.Map 不是一个 @javax.persistence.Entity 呀
cccy0
2019-06-01 21:00:39 +08:00
@c4f36e5766583218 #3 spring data jpa 底层有一个实现了 convert 接口的转换类, 就是用来把查询结果集转换成 Map 的,但是他太底层而且封装的太死了所以没法复用 = =,如果用 Map 来接收返回值, 类似这样:

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {

List<Map> findAllByUsernameAndIsDeleted(String username, Integer isDeleted);

那么他就会调用这个转换类来转换成 Map, 但是 criteria 查询并没有这样的支持直接转换成 Map 的东西 -.-
c4f36e5766583218
2019-06-01 21:29:22 +08:00
你都提到了 import javax.persistence.EntityManager;那是否一定得用到 javax.persistence.Entity 这个类呢?如果是,你有用到吗?
cccy0
2019-06-02 16:24:05 +08:00
@c4f36e5766583218 #5。。我说了好多遍了, @Entity 这个注解肯定是用的到的,因为 ORM 框架要用这个类来定义实体 我上方代码中的 public interface UserRepository extends JpaRepository<User, Long> 这个借口你没有看到吗, 如果我没有用注解 @Entity 注解 User 这个实体类,那么它能放在 JpaRepository<User, Long> 的泛型里吗
cccy0
2019-06-02 16:27:22 +08:00
@c4f36e5766583218 #5 我一直在强调的是 JPA 的“ criteria ” 查询,是可以把查询出来的结果直接转换成实体类的,但是它并 不能优雅地把查询结果转换成 Map 这种数据结构, 我说了好多次 ” criteria 查询“, 但是你一直在说 @Entity 这个注解,这个只是定义实体的一个注解而已, 我觉得你没明白我提出的问题
c4f36e5766583218
2019-06-03 09:58:32 +08:00
```让它返回 List<Map>这种类型``` 应该不行,返回结果可以是
1. Entity
2. List<Entity>
3. 基本数据类型,number,boolean
4. 其它???
这样吧???
cccy0
2019-06-03 21:41:34 +08:00
@c4f36e5766583218 #8 是可以返回 Map 的, 比如 List<Map<String,Object>>这种是可以的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568923

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX