Currently I am working on giving a label to my data. I will give the label to data that marked as highest on the resulting query. the problem is the label is not only for 1 case but multiple, and also I need pagination for the query using Pageable.
*Note: I need it by query because I think it's not feasible to do in Java because 1. the API might have big number of hit, 2. the logic of pagination containing page_number and page_size and sorting query.
Example of data
id | name | power | heigh |
---|---|---|---|
uuid1 | ace | 1000 | 170 |
uuid2 | luffy | 990 | 168 |
uuid3 | zorro | 980 | 167 |
uuid4 | sanji | 970 | 180 |
Mocked result that I wanted when I queried is like this
id | name | power | is_highest_power | heigh | is_highest_heigh |
---|---|---|---|---|---|
uuid1 | ace | 1000 | true | 170 | false |
uuid2 | luffy | 990 | false | 168 | false |
uuid3 | zorro | 980 | false | 167 | false |
uuid4 | sanji | 970 | false | 180 | true |
Currently, working on it with Postgresql db with java JPARepository interface. I need to build the native query with pagination in it and also a filter for the result.
@Query(
nativeQuery = true,
countQuery = "SELECT count(1) "
+ " FROM user u "
+ " WHERE (:startPower IS NULL OR u.power >= :startPower) AND "
+ " (:startHeigh IS NULL OR u.heigh >= :startHeigh)",
value = "SELECT u.id, u.name, u.power, u.is_highest_power (??), u.heigh, "
+ " u.is_highest_heigh (??)"
+ " FROM user u "
+ " WHERE (:startPower IS NULL OR u.power >= :startPower) AND "
+ " (:startHeigh IS NULL OR u.heigh >= :startHeigh)"
)
Page<SearchUser> searchUser(
Pageable pageable,
BigDecimal startPower,
BigDecimal startHeigh
);
public interface SearchUser {
@Value("#{target.id}")
String getId();
@Value("#{target.name}")
String getName();
@Value("#{target.power}")
BigDecimal getPower();
@Value("#{target.is_highest_power}")
Boolean getIsHighestPower();
@Value("#{target.heigh}")
BigDecimal getHeigh();
@Value("#{target.is_highest_heigh}")
Boolean getIsHighestHeigh();
I have found how to query to get the highest power or heigh (as mentioned here) but can not found how to mark a row as the highest and query it as the result column too.
How to achieve this in nativeQuery string?
See if using
CASE WHEN
helps.Output