Option 1 - Workaround: You can use 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();
}
Option 2 - CASE block: add a condition inside the SELECT query part:
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
The solution will looks like this:
@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 );
Reference Wikipedia article: New in JPA 2.0
Option 3 - JPA Criteria 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.
OpenJPA: Chapter 11. JPA Criteria
Bueldung: JPA Criteria Queries