V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cccy0
V2EX  ›  问与答

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

  •  
  •   cccy0 · 2019-05-29 22:07:52 +08:00 · 3204 次点击
    这是一个创建于 1795 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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>这种类型来着。。。
    9 条回复    2019-06-03 21:41:34 +08:00
    c4f36e5766583218
        1
    c4f36e5766583218  
       2019-05-29 23:42:27 +08:00
    cccy0
        2
    cccy0  
    OP
       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
        3
    c4f36e5766583218  
       2019-05-31 10:21:53 +08:00
    你说的返回 List<Map> java.util.Map 不是一个 @javax.persistence.Entity 呀
    cccy0
        4
    cccy0  
    OP
       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
        5
    c4f36e5766583218  
       2019-06-01 21:29:22 +08:00
    你都提到了 import javax.persistence.EntityManager;那是否一定得用到 javax.persistence.Entity 这个类呢?如果是,你有用到吗?
    cccy0
        6
    cccy0  
    OP
       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
        7
    cccy0  
    OP
       2019-06-02 16:27:22 +08:00
    @c4f36e5766583218 #5 我一直在强调的是 JPA 的“ criteria ” 查询,是可以把查询出来的结果直接转换成实体类的,但是它并 不能优雅地把查询结果转换成 Map 这种数据结构, 我说了好多次 ” criteria 查询“, 但是你一直在说 @Entity 这个注解,这个只是定义实体的一个注解而已, 我觉得你没明白我提出的问题
    c4f36e5766583218
        8
    c4f36e5766583218  
       2019-06-03 09:58:32 +08:00
    ```让它返回 List<Map>这种类型``` 应该不行,返回结果可以是
    1. Entity
    2. List<Entity>
    3. 基本数据类型,number,boolean
    4. 其它???
    这样吧???
    cccy0
        9
    cccy0  
    OP
       2019-06-03 21:41:34 +08:00
    @c4f36e5766583218 #8 是可以返回 Map 的, 比如 List<Map<String,Object>>这种是可以的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1110 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:14 · PVG 02:14 · LAX 11:14 · JFK 14:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.