Java JPA 查询实体部分字段

本文介绍了一种在Java JPA中查询特定字段的方法,并提供了一个通用的封装方案,允许开发者仅选择所需的字段进行查询,提高了查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

相信大家在用Java JPA作为ORM的时候都会有这种困惑,就是某个表T我仅仅希望取到其中的A、B、C三个字段,可是jpa是通过Entity Class映射的方式组合查询结果的。
那么如何通过使用JPA查询部分想要的内容,下面我把它做了一些通用的封装,供大家参考。痛快点,直接上代码!

实现


public interface BaseService<T,ID extends Serializable>  {
    
    List<Object[]> findAllByNavtiveSQLBase(String sql);
    
    Page<Object[]> findAllByNavtiveSQLPagingBase(String sql, Pageable pageable);
}

public abstract class BaseServiceImpl<T, ID extends Serializable> implements BaseService<T, ID>   {

    @Autowired
    protected BaseRepository<T, ID> baseRepository;
    @PersistenceContext(unitName="primaryPersistenceUnit")
    @Qualifier(value = "primaryDataSource")
    @Autowired
    protected EntityManager entityManager;

    @Override
    public List<Object[]> findAllByNavtiveSQLBase(String sql){
        try {
            Query query = entityManager.createNativeQuery(sql);
            @SuppressWarnings("unchecked")
            List<Object[]> list = query.getResultList();
            System.out.println("list.size() = " + list.size());
            entityManager.close();
            return list;
        } catch (RuntimeException ex) {
            throw ex;
        }
    }
    
    @Override
    public Page<Object[]> findAllByNavtiveSQLPagingBase(String sql, Pageable pageable){
        try {
            Query query = entityManager.createNativeQuery(sql);
            long total = query.getResultList().size();

            Iterator<Order> orders = pageable.getSort().iterator();
            String pageOrder = orders.hasNext() ? "order by" : "";
            while (orders.hasNext()) {
                Order order = (Order) orders.next();
                pageOrder += String.format(" %s %s%s", order.getProperty(), order.getDirection(), (orders.hasNext() ? ", " : ""));
            }
            
            int size = pageable.getPageSize();
            int begin = (pageable.getPageNumber() - 1) * size;
            String pageSql = String.format("%s %s limit %s, %s", sql, pageOrder, begin, size);

            System.out.println("pageSql = " + pageSql);
            query = entityManager.createNativeQuery(pageSql);
            @SuppressWarnings("unchecked")
            List<Object[]> list = query.getResultList();

            entityManager.close();
            return new PageImpl<Object[]>(list, pageable, total);
        } catch (RuntimeException ex) {
            throw ex;
        }
    }
}


@Service
public class ServiceAttendanceRecordImpl extends BaseServiceImpl<AttendanceRecord,Integer> implements ServiceAttendanceRecord {

}

所有继承了BaseServiceImpl类的实现默认都有了通用的sql查询功能

如何使用


List<Object[]> list = serviceCompanyEntityImpl.findAllByNavtiveSQLBase("SELECT A, B, C FROM T");
        for (Object[] objects : list) {
            for (Object object : objects) {

            }
        }

转载于:https://www.cnblogs.com/Romantic/p/5946403.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值