Spring Data Jpa 动态选择表列

tpgth1q7  于 2023-10-20  发布在  Spring
关注(0)|答案(2)|浏览(129)

我在Spring Boot 中使用JAVA JPA。该方案是我的表有大约8列(假设id,A,B,C,D,E,F,G,H)从这些我想要5列作为结果E,F,G,H和只有一个从A,B,C,D这将不是固定的每次执行
我曾这样写过。
@Query(“Select:dynamicColName,E,F,G,H FROM TABLEname where id=:id“)List findById(@Param(“dynamicColName”)String dynamicColName,@Param(“id”)String id);
没有用这里的查询没有引用dynamicColName的值作为列名。
建议是高度赞赏。
查询中的动态列名注入

4si2a6ki

4si2a6ki1#

实现动态查询最简单的方法之一是使用Spring Data JPA规范
结果将是这样的,你可以选择你想要查询的参数。

List<PostComment> comments = postCommentRepository.findAll(
    orderByCreatedOn(
        byPost(post)
            .and(byStatus(PostComment.Status.PENDING))
            .and(byReviewLike(reviewPattern))
            .and(byVotesGreaterThanEqual(minVotes))
    )
);

更多信息:https://vladmihalcea.com/spring-data-jpa-specification/

hec6srdp

hec6srdp2#

选项1 -解决方法:您可以使用EntityManager:

static final String QUERY = "SELECT (%s),E,F,G,H FROM TABLEname where id=:id";        

@Autowired
EntityManager entityManager;

Query createQuery(String dynamicColName, String id) {
    String sql = String.format(QUERY, dynamicColName);
    Query query = entityManager.createNativeQuery(sql, YourTableEntityName.class);
    query .setParameter("id", id);
    return query;
}

public List<YourTableEntityName> findById(String dynamicColName, String id) {
    Query q = createQuery(dynamicColName, id);
    return q.getResultList();   
}

选项2 - CASE块:在SELECT查询部分中添加一个条件:

SELECT
 CASE 
    WHEN (t.id >= 1000) THEN colunm1 
    WHEN (e.id < 1000) THEN colunm2 
    ELSE colunm3 END,
 E,F,G,H
FROM TABLEname t
WHERE id=:id

解决方案如下所示:

@Query("SELECT CASE WHEN (t.id >= 1000) THEN dynamicColName1 WHEN (e.id < 1000) THEN dynamicColName2 ELSE dynamicColName3  END, E,F,G,H FROM TABLEname t WHERE id=:id ") 
List findById(@Param("id")String id );

参考维基百科文章:JPA 2.0中的新特性

选项3 - JPA标准API

EntityManager em = ... ; 
CriteriaBuilder queryBuilder = em.getCriteriaBuilder();
CriteriaQuery qdef = queryBuilder.createQuery();

if (someCondition1) {
    //select columnA
    qdef.select(customer.get(TableEntity_.columnA));
} else if (someCondition2) {
    //select columnB
    qdef.select(customer.get(TableEntity_.columnB));
}
// where condition with ID check.

第11章. JPA标准
Bueldung: JPA Criteria Queries

相关问题