为了账号安全,请及时绑定邮箱和手机立即绑定

创建不带实体的弹簧存储库

创建不带实体的弹簧存储库

潇湘沐 2022-09-21 16:59:00

我想使用spring数据存储库接口来执行本机查询 - 我认为这种方式是最简单的,因为复杂性较低。

但是当扩展接口ex。 我需要编写 T - 我的实体,这不可用。CrudRepository<T, ID>

我的本机查询不返回任何具体实体,那么创建没有实体的弹簧存储库的最佳方法是什么?


查看完整描述

4 回答

?
qq_遁去的一_1

TA贡献1391条经验 获得超7个赞

CrudRepository或者不是设计为没有一对。JpaRepository<Entity,ID>


您最好创建自定义存储库,注入实体管理器并从那里进行查询:


  @Repository

  public class CustomNativeRepositoryImpl implements CustomNativeRepository {


    @Autowired

    private EntityManager entityManager;


    @Override

    public Object runNativeQuery() {

        entityManager.createNativeQuery("myNativeQuery")

         .getSingleResult();

    }

}


查看完整回答
反对 回复 5天前
?
慕田峪7331174

TA贡献1478条经验 获得超13个赞

目前,JPA 中没有创建仅具有本机或 JPQL/HQL 查询(使用@Query表示法)的存储库的功能。要解决此问题,您可以创建一个虚拟对象以插入到扩展界面中,如下所示:


@Entity

public class RootEntity {

    @Id

    private Integer id;

}


@Repository

public interface Repository extends JpaRepository<RootEntity, Integer> {

}


查看完整回答
反对 回复 5天前
?
幕布斯6054654

TA贡献1545条经验 获得超7个赞

这对我们有用。请参阅实体管理器


https://www.baeldung.com/hibernate-entitymanager


@Repository

public class MyRepository {


    @PersistenceContext

    EntityManager entityManager;


    public void doSomeQuery(){

        Query query = entityManager.createNativeQuery("SELECT foo FROM bar");

        query.getResultsList()

        ...

    }


}

顺便说一句,我不认为这里甚至不需要@Repository注释。


查看完整回答
反对 回复 5天前
?
凤凰求蛊

TA贡献1498条经验 获得超1个赞

您可以使用 注释您的实现,并获取实体管理器的实例。@Repository


public interface ProductFilterRepository {

    Page<Product> filter(FilterTO filter, Pageable pageable);

}




@Repository

@AllArgsConstructor

public class ProductFilterRepositoryImpl implements ProductFilterRepository {


    private final EntityManager em;


    @Override

    public Page<Product> filter(FilterTO filter, Pageable pageable) {

        CriteriaBuilder cb = em.getCriteriaBuilder();

        CriteriaQuery<Product> cq = cb.createQuery(Product.class);

        Root<Product> root = cq.from(Product.class);

        List<Predicate> predicates = new ArrayList<>();


        if (filter.getPriceMin() != null) {

            predicates.add(cb.ge(root.get("price"), filter.getPriceMin()));

        }

        if (filter.getPriceMax() != null) {

            predicates.add(cb.le(root.get("price"), filter.getPriceMax()));

        }

        if (filter.getBrands() != null && !filter.getBrands().isEmpty()) {

            predicates.add(root.get("brand").in(filter.getBrands()));

        }

        if (filter.getCategories() != null && !filter.getCategories().isEmpty()) {

            predicates.add(root.get("category").in(filter.getCategories()));

        }

        cq.where(predicates.toArray(new Predicate[0]));

        TypedQuery<Product> tq = em.createQuery(cq);

        tq.setMaxResults(pageable.getPageSize());

        tq.setFirstResult(pageable.getPageNumber() * pageable.getPageSize());


        CriteriaQuery<Long> countCq = cb.createQuery(Long.class);

        countCq.select(cb.count(countCq.from(Product.class)));

        countCq.where(predicates.toArray(new Predicate[0]));

        TypedQuery<Long> countTq = em.createQuery(countCq);

        Long count = countTq.getSingleResult();


        return new PageImpl<>(tq.getResultList(), pageable, count);

    }

}


查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信