thingsboard-developers

Native-query changed to JPA

6/23/2017 12:20:24 PM

Changes

Details

diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
index e268c45..6c98466 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
@@ -47,7 +47,7 @@ public final class AdminSettingsEntity implements BaseEntity<AdminSettings> {
     private String key;
 
     @Type(type = "json")
-    @Column(name = ADMIN_SETTINGS_JSON_VALUE_PROPERTY, columnDefinition = "json")
+    @Column(name = ADMIN_SETTINGS_JSON_VALUE_PROPERTY)
     private JsonNode jsonValue;
 
     public AdminSettingsEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmEntity.java
index d9f6623..2107a5f 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AlarmEntity.java
@@ -82,7 +82,7 @@ public final class AlarmEntity implements BaseEntity<Alarm> {
     private Long clearTs;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY)
     private JsonNode details;
 
     @Column(name = ALARM_PROPAGATE_PROPERTY)
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AssetEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AssetEntity.java
index bd24fbd..5d24aeb 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AssetEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AssetEntity.java
@@ -62,7 +62,7 @@ public final class AssetEntity implements SearchTextEntity<Asset> {
     private String searchText;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.ASSET_ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     public AssetEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
index 2da59a7..eee9137 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
@@ -58,7 +58,7 @@ public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDesc
     private String clazz;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY)
     private JsonNode configurationDescriptor;
 
     @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_ACTIONS_PROPERTY)
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
index 12c4980..6646652 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
@@ -77,7 +77,7 @@ public final class CustomerEntity implements SearchTextEntity<Customer> {
     private String email;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     public CustomerEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
index 2153db2..5266b90 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
@@ -57,7 +57,7 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> {
     private String searchText;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY)
     private JsonNode configuration;
 
     public DashboardEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java
index 06c9065..f4c8dd2 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DeviceEntity.java
@@ -60,7 +60,7 @@ public final class DeviceEntity implements SearchTextEntity<Device> {
     private String searchText;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.DEVICE_ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     public DeviceEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java
index 033aaa5..ff79687 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/EventEntity.java
@@ -63,7 +63,7 @@ public class EventEntity implements BaseEntity<Event> {
     private String eventUid;
 
     @Type(type = "json")
-    @Column(name = EVENT_BODY_PROPERTY, columnDefinition = "json")
+    @Column(name = EVENT_BODY_PROPERTY)
     private JsonNode body;
 
     public EventEntity(Event event) {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java
index 3972310..a53c1ab 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/PluginMetaDataEntity.java
@@ -63,11 +63,11 @@ public class PluginMetaDataEntity implements SearchTextEntity<PluginMetaData> {
     private ComponentLifecycleState state;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.PLUGIN_CONFIGURATION_PROPERTY)
     private JsonNode configuration;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java
index 3ee09d4..d13a7ef 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RelationEntity.java
@@ -62,7 +62,7 @@ public final class RelationEntity implements ToData<EntityRelation> {
     private String relationType;
 
     @Type(type = "json")
-    @Column(name = ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     public RelationEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java
index 6191672..33971c3 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/RuleMetaDataEntity.java
@@ -64,19 +64,19 @@ public class RuleMetaDataEntity implements SearchTextEntity<RuleMetaData> {
     private String pluginToken;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.RULE_FILTERS, columnDefinition = "json")
+    @Column(name = ModelConstants.RULE_FILTERS)
     private JsonNode filters;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.RULE_PROCESSOR, columnDefinition = "json")
+    @Column(name = ModelConstants.RULE_PROCESSOR)
     private JsonNode processor;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.RULE_ACTION, columnDefinition = "json")
+    @Column(name = ModelConstants.RULE_ACTION)
     private JsonNode action;
 
     @Type(type = "json")
-    @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     public RuleMetaDataEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java
index 755ca8c..19cfe4b 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/TenantEntity.java
@@ -76,7 +76,7 @@ public final class TenantEntity implements SearchTextEntity<Tenant> {
     private String email;
 
     @Type(type="json")
-    @Column(name = ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.TENANT_ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     public TenantEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java
index f76b2d8..ccfaba1 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/UserEntity.java
@@ -70,7 +70,7 @@ public class UserEntity implements SearchTextEntity<User> {
     private String lastName;
 
     @Type(type="json")
-    @Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.USER_ADDITIONAL_INFO_PROPERTY)
     private JsonNode additionalInfo;
 
     public UserEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java
index 90b1b71..c7d62d8 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java
@@ -51,9 +51,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
     @Column(name = ModelConstants.SEARCH_TEXT_PROPERTY)
     private String searchText;
 
-    @Column(name = ModelConstants.WIDGETS_BUNDLE_IMAGE_PROPERTY)
-    private byte[] image;
-
     public WidgetsBundleEntity() {
         super();
     }
@@ -67,9 +64,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
         }
         this.alias = widgetsBundle.getAlias();
         this.title = widgetsBundle.getTitle();
-        if (widgetsBundle.getImage() != null) {
-            this.image = widgetsBundle.getImage();
-        }
     }
 
     @Override
@@ -101,7 +95,6 @@ public final class WidgetsBundleEntity implements SearchTextEntity<WidgetsBundle
         }
         widgetsBundle.setAlias(alias);
         widgetsBundle.setTitle(title);
-        widgetsBundle.setImage(image);
         return widgetsBundle;
     }
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java
index 4f96b64..38f83cb 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetTypeEntity.java
@@ -56,7 +56,7 @@ public final class WidgetTypeEntity implements BaseEntity<WidgetType> {
     private String name;
 
     @Type(type="json")
-    @Column(name = ModelConstants.WIDGET_TYPE_DESCRIPTOR_PROPERTY, columnDefinition = "json")
+    @Column(name = ModelConstants.WIDGET_TYPE_DESCRIPTOR_PROPERTY)
     private JsonNode descriptor;
 
     public WidgetTypeEntity() {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
index a7162cd..c89fef6 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/AlarmRepository.java
@@ -15,12 +15,15 @@
  */
 package org.thingsboard.server.dao.sql.alarm;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
+import org.thingsboard.server.common.data.EntityType;
 import org.thingsboard.server.dao.annotation.SqlDao;
 import org.thingsboard.server.dao.model.sql.AlarmEntity;
 
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -29,10 +32,11 @@ import java.util.UUID;
 @SqlDao
 public interface AlarmRepository extends CrudRepository<AlarmEntity, UUID> {
 
-    @Query(nativeQuery = true, value = "SELECT * FROM ALARM WHERE TENANT_ID = :tenantId AND ORIGINATOR_ID = :originatorId " +
-            "AND ORIGINATOR_TYPE = :entityType AND TYPE = :alarmType ORDER BY TYPE ASC, ID DESC LIMIT 1")
-    AlarmEntity findLatestByOriginatorAndType(@Param("tenantId") UUID tenantId,
-                                              @Param("originatorId") UUID originatorId,
-                                              @Param("entityType") int entityType,
-                                              @Param("alarmType") String alarmType);
+    @Query("SELECT a FROM AlarmEntity a WHERE a.tenantId = :tenantId AND a.originatorId = :originatorId " +
+            "AND a.originatorType = :entityType AND a.type = :alarmType ORDER BY a.type ASC, a.id DESC")
+    List<AlarmEntity> findLatestByOriginatorAndType(@Param("tenantId") UUID tenantId,
+                                                    @Param("originatorId") UUID originatorId,
+                                                    @Param("entityType") EntityType entityType,
+                                                    @Param("alarmType") String alarmType,
+                                                    Pageable pageable);
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
index 5517ec1..322afe7 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDao.java
@@ -21,6 +21,7 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -74,12 +75,15 @@ public class JpaAlarmDao extends JpaAbstractDao<AlarmEntity, Alarm> implements A
     @Override
     @Transactional(propagation = REQUIRES_NEW)
     public ListenableFuture<Alarm> findLatestByOriginatorAndType(TenantId tenantId, EntityId originator, String type) {
-        return service.submit(() ->
-                DaoUtil.getData(alarmRepository.findLatestByOriginatorAndType(
-                        tenantId.getId(),
-                        originator.getId(),
-                        originator.getEntityType().ordinal(),
-                        type)));
+        return service.submit(() -> {
+            List<AlarmEntity> latest = alarmRepository.findLatestByOriginatorAndType(
+                    tenantId.getId(),
+                    originator.getId(),
+                    originator.getEntityType(),
+                    type,
+                    new PageRequest(0, 1));
+            return latest.isEmpty() ? null : DaoUtil.getData(latest.get(0));
+        });
     }
 
     @Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java
index 3f5e491..8f86437 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/AssetRepository.java
@@ -15,6 +15,8 @@
  */
 package org.thingsboard.server.dao.sql.asset;
 
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -31,23 +33,23 @@ import java.util.UUID;
 @SqlDao
 public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
 
-    @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<AssetEntity> findByTenantId(@Param("limit") int limit,
-                                     @Param("tenantId") UUID tenantId,
+    @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
+            "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND a.id > :idOffset ORDER BY a.id")
+    List<AssetEntity> findByTenantId(@Param("tenantId") UUID tenantId,
                                      @Param("textSearch") String textSearch,
-                                     @Param("idOffset") UUID idOffset);
+                                     @Param("idOffset") UUID idOffset,
+                                     Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
-            "AND CUSTOMER_ID = :customerId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<AssetEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
-                                                  @Param("tenantId") UUID tenantId,
+    @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
+            "AND a.customerId = :customerId " +
+            "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND a.id > :idOffset ORDER BY a.id")
+    List<AssetEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
                                                   @Param("customerId") UUID customerId,
                                                   @Param("textSearch") String textSearch,
-                                                  @Param("idOffset") UUID idOffset);
+                                                  @Param("idOffset") UUID idOffset,
+                                                  Pageable pageable);
 
     List<AssetEntity> findByTenantIdAndIdIn(UUID tenantId, List<UUID> assetIds);
 
@@ -55,27 +57,27 @@ public interface AssetRepository extends CrudRepository<AssetEntity, UUID> {
 
     AssetEntity findByTenantIdAndName(UUID tenantId, String name);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
-            "AND TYPE = :type " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<AssetEntity> findByTenantIdAndType(@Param("limit") int limit,
-                                            @Param("tenantId") UUID tenantId,
+    @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
+            "AND a.type = :type " +
+            "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND a.id > :idOffset ORDER BY a.id")
+    List<AssetEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
                                             @Param("type") String type,
                                             @Param("textSearch") String textSearch,
-                                            @Param("idOffset") UUID idOffset);
+                                            @Param("idOffset") UUID idOffset,
+                                            Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM ASSET WHERE TENANT_ID = :tenantId " +
-            "AND CUSTOMER_ID = :customerId AND TYPE = :type " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("limit") int limit,
-                                                         @Param("tenantId") UUID tenantId,
+    @Query("SELECT a FROM AssetEntity a WHERE a.tenantId = :tenantId " +
+            "AND a.customerId = :customerId AND a.type = :type " +
+            "AND LOWER(a.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND a.id > :idOffset ORDER BY a.id")
+    List<AssetEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
                                                          @Param("customerId") UUID customerId,
                                                          @Param("type") String type,
                                                          @Param("textSearch") String textSearch,
-                                                         @Param("idOffset") UUID idOffset);
+                                                         @Param("idOffset") UUID idOffset,
+                                                         Pageable pageable);
 
-    @Query(value = "SELECT NEW org.thingsboard.server.common.data.asset.TenantAssetType(a.type, a.tenantId) FROM AssetEntity a GROUP BY a.tenantId, a.type")
+    @Query("SELECT NEW org.thingsboard.server.common.data.asset.TenantAssetType(a.type, a.tenantId) FROM AssetEntity a GROUP BY a.tenantId, a.type")
     List<TenantAssetType> findTenantAssetTypes();
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java
index 39f8111..500b612 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/asset/JpaAssetDao.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.asset;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.asset.Asset;
@@ -29,6 +30,7 @@ import org.thingsboard.server.dao.model.sql.AssetEntity;
 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
 
@@ -58,10 +60,10 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
     public List<Asset> findAssetsByTenantId(UUID tenantId, TextPageLink pageLink) {
         return DaoUtil.convertDataList(assetRepository
                 .findByTenantId(
-                        pageLink.getLimit(),
                         tenantId,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
@@ -74,11 +76,11 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
     public List<Asset> findAssetsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
         return DaoUtil.convertDataList(assetRepository
                 .findByTenantIdAndCustomerId(
-                        pageLink.getLimit(),
                         tenantId,
                         customerId,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
@@ -97,23 +99,23 @@ public class JpaAssetDao extends JpaAbstractSearchTextDao<AssetEntity, Asset> im
     public List<Asset> findAssetsByTenantIdAndType(UUID tenantId, String type, TextPageLink pageLink) {
         return DaoUtil.convertDataList(assetRepository
                 .findByTenantIdAndType(
-                        pageLink.getLimit(),
                         tenantId,
                         type,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
     public List<Asset> findAssetsByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) {
         return DaoUtil.convertDataList(assetRepository
                 .findByTenantIdAndCustomerIdAndType(
-                        pageLink.getLimit(),
                         tenantId,
                         customerId,
                         type,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
index e86b838..f15bbbf 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.component;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -32,22 +33,22 @@ public interface ComponentDescriptorRepository extends CrudRepository<ComponentD
 
     ComponentDescriptorEntity findByClazz(String clazz);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<ComponentDescriptorEntity> findByType(@Param("limit") int limit,
-                                               @Param("type") String type,
+    @Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type " +
+            "AND LOWER(cd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND cd.id > :idOffset ORDER BY cd.id")
+    List<ComponentDescriptorEntity> findByType(@Param("type") String type,
                                                @Param("textSearch") String textSearch,
-                                               @Param("idOffset") UUID idOffset);
+                                               @Param("idOffset") UUID idOffset,
+                                               Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = :type " +
-            "AND SCOPE = :scope AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<ComponentDescriptorEntity> findByScopeAndType(@Param("limit") int limit,
-                                                       @Param("type") String type,
+    @Query("SELECT cd FROM ComponentDescriptorEntity cd WHERE cd.type = :type " +
+            "AND cd.scope = :scope AND LOWER(cd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND cd.id > :idOffset ORDER BY cd.id")
+    List<ComponentDescriptorEntity> findByScopeAndType(@Param("type") String type,
                                                        @Param("scope") String scope,
                                                        @Param("textSearch") String textSearch,
-                                                       @Param("idOffset") UUID idOffset);
+                                                       @Param("idOffset") UUID idOffset,
+                                                       Pageable pageable);
 
     void deleteByClazz(String clazz);
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
index 023e7a5..e259bba 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.component;
 
 import com.datastax.driver.core.utils.UUIDs;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.id.ComponentDescriptorId;
@@ -31,6 +32,7 @@ import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
 
@@ -83,21 +85,21 @@ public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<Comp
     public List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
         return DaoUtil.convertDataList(componentDescriptorRepository
                 .findByType(
-                        pageLink.getLimit(),
                         type.toString(),
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
     public List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
         return DaoUtil.convertDataList(componentDescriptorRepository
                 .findByScopeAndType(
-                        pageLink.getLimit(),
                         type.toString(),
                         scope.toString(),
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
index 0bf4f13..009f926 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.customer;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -30,13 +31,13 @@ import java.util.UUID;
 @SqlDao
 public interface CustomerRepository extends CrudRepository<CustomerEntity, UUID> {
 
-    @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = :tenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<CustomerEntity> findByTenantId(@Param("limit") int limit,
-                                        @Param("tenantId") UUID tenantId,
+    @Query("SELECT c FROM CustomerEntity c WHERE c.tenantId = :tenantId " +
+            "AND LOWER(c.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND c.id > :idOffset ORDER BY c.id")
+    List<CustomerEntity> findByTenantId(@Param("tenantId") UUID tenantId,
                                         @Param("textSearch") String textSearch,
-                                        @Param("idOffset") UUID idOffset);
+                                        @Param("idOffset") UUID idOffset,
+                                        Pageable pageable);
 
     CustomerEntity findByTenantIdAndTitle(UUID tenantId, String title);
 
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
index d5ae9ab..de54835 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
@@ -16,6 +16,7 @@
 package org.thingsboard.server.dao.sql.customer;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.Customer;
@@ -27,6 +28,7 @@ import org.thingsboard.server.dao.model.sql.CustomerEntity;
 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
 
@@ -54,8 +56,11 @@ public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Cus
 
     @Override
     public List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) {
-        return DaoUtil.convertDataList(customerRepository.findByTenantId(pageLink.getLimit(), tenantId,
-                pageLink.getTextSearch(), pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+        return DaoUtil.convertDataList(customerRepository.findByTenantId(
+                tenantId,
+                Objects.toString(pageLink.getTextSearch(), ""),
+                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
index a4e3412..2569867 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.dashboard;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -30,20 +31,20 @@ import java.util.UUID;
 @SqlDao
 public interface DashboardInfoRepository extends CrudRepository<DashboardInfoEntity, UUID> {
 
-    @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<DashboardInfoEntity> findByTenantId(@Param("limit") int limit,
-                                             @Param("tenantId") UUID tenantId,
-                                             @Param("textSearch") String textSearch,
-                                             @Param("idOffset") UUID idOffset);
+    @Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " +
+            "AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
+            "AND di.id > :idOffset ORDER BY di.id")
+    List<DashboardInfoEntity> findByTenantId(@Param("tenantId") UUID tenantId,
+                                             @Param("searchText") String searchText,
+                                             @Param("idOffset") UUID idOffset,
+                                             Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = :tenantId " +
-            "AND CUSTOMER_ID = :customerId AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
-                                                          @Param("tenantId") UUID tenantId,
+    @Query("SELECT di FROM DashboardInfoEntity di WHERE di.tenantId = :tenantId " +
+            "AND di.customerId = :customerId AND LOWER(di.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
+            "AND di.id > :idOffset ORDER BY di.id")
+    List<DashboardInfoEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
                                                           @Param("customerId") UUID customerId,
-                                                          @Param("textSearch") String textSearch,
-                                                          @Param("idOffset") UUID idOffset);
+                                                          @Param("searchText") String searchText,
+                                                          @Param("idOffset") UUID idOffset,
+                                                          Pageable pageable);
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
index d1d2b77..c604c7e 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
@@ -16,6 +16,7 @@
 package org.thingsboard.server.dao.sql.dashboard;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.DashboardInfo;
@@ -27,6 +28,7 @@ import org.thingsboard.server.dao.model.sql.DashboardInfoEntity;
 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@@ -55,20 +57,20 @@ public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoE
     public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
         return DaoUtil.convertDataList(dashboardInfoRepository
                 .findByTenantId(
-                        pageLink.getLimit(),
                         tenantId,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
     public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
         return DaoUtil.convertDataList(dashboardInfoRepository
                 .findByTenantIdAndCustomerId(
-                        pageLink.getLimit(),
                         tenantId,
                         customerId,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java
index 8102553..771ab69 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/DeviceRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.device;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -32,47 +33,47 @@ import java.util.UUID;
 public interface DeviceRepository extends CrudRepository<DeviceEntity, UUID> {
 
 
-    @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
-            "AND CUSTOMER_ID = :customerId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<DeviceEntity> findByTenantIdAndCustomerId(@Param("limit") int limit,
-                                                   @Param("tenantId") UUID tenantId,
+    @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
+            "AND d.customerId = :customerId " +
+            "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
+            "AND d.id > :idOffset ORDER BY d.id")
+    List<DeviceEntity> findByTenantIdAndCustomerId(@Param("tenantId") UUID tenantId,
                                                    @Param("customerId") UUID customerId,
                                                    @Param("searchText") String searchText,
-                                                   @Param("idOffset") UUID idOffset);
+                                                   @Param("idOffset") UUID idOffset,
+                                                   Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<DeviceEntity> findByTenantId(@Param("limit") int limit,
-                                      @Param("tenantId") UUID tenantId,
+    @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
+            "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND d.id > :idOffset ORDER BY d.id")
+    List<DeviceEntity> findByTenantId(@Param("tenantId") UUID tenantId,
                                       @Param("textSearch") String textSearch,
-                                      @Param("idOffset") UUID idOffset);
+                                      @Param("idOffset") UUID idOffset,
+                                      Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
-            "AND TYPE = :type " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<DeviceEntity> findByTenantIdAndType(@Param("limit") int limit,
-                                             @Param("tenantId") UUID tenantId,
+    @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
+            "AND d.type = :type " +
+            "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND d.id > :idOffset ORDER BY d.id")
+    List<DeviceEntity> findByTenantIdAndType(@Param("tenantId") UUID tenantId,
                                              @Param("type") String type,
                                              @Param("textSearch") String textSearch,
-                                             @Param("idOffset") UUID idOffset);
+                                             @Param("idOffset") UUID idOffset,
+                                             Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM DEVICE WHERE TENANT_ID = :tenantId " +
-            "AND CUSTOMER_ID = :customerId " +
-            "AND TYPE = :type " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("limit") int limit,
-                                                          @Param("tenantId") UUID tenantId,
+    @Query("SELECT d FROM DeviceEntity d WHERE d.tenantId = :tenantId " +
+            "AND d.customerId = :customerId " +
+            "AND d.type = :type " +
+            "AND LOWER(d.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND d.id > :idOffset ORDER BY d.id")
+    List<DeviceEntity> findByTenantIdAndCustomerIdAndType(@Param("tenantId") UUID tenantId,
                                                           @Param("customerId") UUID customerId,
                                                           @Param("type") String type,
                                                           @Param("textSearch") String textSearch,
-                                                          @Param("idOffset") UUID idOffset);
+                                                          @Param("idOffset") UUID idOffset,
+                                                          Pageable pageable);
 
-    @Query(value = "SELECT DISTINCT NEW org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity(d.tenantId, d.type) FROM DeviceEntity d")
+    @Query("SELECT DISTINCT NEW org.thingsboard.server.dao.model.sql.TenantDeviceTypeEntity(d.tenantId, d.type) FROM DeviceEntity d")
     List<TenantDeviceTypeEntity> findTenantDeviceTypes();
 
     DeviceEntity findByTenantIdAndName(UUID tenantId, String name);
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java
index 68f4262..d713040 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceDao.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.device;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.Device;
@@ -58,11 +59,10 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
     public List<Device> findDevicesByTenantId(UUID tenantId, TextPageLink pageLink) {
         return DaoUtil.convertDataList(
                 deviceRepository.findByTenantId(
-                        pageLink.getLimit(),
                         tenantId,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
-        );
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
@@ -74,12 +74,11 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
     public List<Device> findDevicesByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
         return DaoUtil.convertDataList(
                 deviceRepository.findByTenantIdAndCustomerId(
-                        pageLink.getLimit(),
                         tenantId,
                         customerId,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
-        );
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
@@ -98,25 +97,23 @@ public class JpaDeviceDao extends JpaAbstractSearchTextDao<DeviceEntity, Device>
     public List<Device> findDevicesByTenantIdAndType(UUID tenantId, String type, TextPageLink pageLink) {
         return DaoUtil.convertDataList(
                 deviceRepository.findByTenantIdAndType(
-                        pageLink.getLimit(),
                         tenantId,
                         type,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
-        );
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
     public List<Device> findDevicesByTenantIdAndCustomerIdAndType(UUID tenantId, UUID customerId, String type, TextPageLink pageLink) {
         return DaoUtil.convertDataList(
                 deviceRepository.findByTenantIdAndCustomerIdAndType(
-                        pageLink.getLimit(),
                         tenantId,
                         customerId,
                         type,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset())
-        );
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java
index 109ea55..b824ebd 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/JpaBasePluginDao.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.plugin;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.id.PluginId;
@@ -31,6 +32,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@@ -96,10 +98,10 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
         log.debug("Try to find plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
         List<PluginMetaDataEntity> entities = pluginMetaDataRepository
                 .findByTenantIdAndPageLink(
-                        pageLink.getLimit(),
                         tenantId.getId(),
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit()));
         if (log.isTraceEnabled()) {
             log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
         } else {
@@ -113,11 +115,11 @@ public class JpaBasePluginDao extends JpaAbstractSearchTextDao<PluginMetaDataEnt
         log.debug("Try to find all tenant plugins by tenantId [{}] and pageLink [{}]", tenantId, pageLink);
         List<PluginMetaDataEntity> entities = pluginMetaDataRepository
                 .findAllTenantPluginsByTenantId(
-                        pageLink.getLimit(),
                         tenantId,
                         NULL_UUID,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit()));
         if (log.isTraceEnabled()) {
             log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
         } else {
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java
index e05fe81..7fc454a 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/plugin/PluginMetaDataRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.plugin;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -32,20 +33,20 @@ public interface PluginMetaDataRepository extends CrudRepository<PluginMetaDataE
 
     PluginMetaDataEntity findByApiToken(String apiToken);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID = :tenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<PluginMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
-                                                         @Param("tenantId") UUID tenantId,
+    @Query("SELECT pmd FROM PluginMetaDataEntity pmd WHERE pmd.tenantId = :tenantId " +
+            "AND LOWER(pmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND pmd.id > :idOffset ORDER BY pmd.id")
+    List<PluginMetaDataEntity> findByTenantIdAndPageLink(@Param("tenantId") UUID tenantId,
                                                          @Param("textSearch") String textSearch,
-                                                         @Param("idOffset") UUID idOffset);
+                                                         @Param("idOffset") UUID idOffset,
+                                                         Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM PLUGIN WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(@Param("limit") int limit,
-                                                              @Param("tenantId") UUID tenantId,
+    @Query("SELECT pmd FROM PluginMetaDataEntity pmd WHERE pmd.tenantId IN (:tenantId, :nullTenantId) " +
+            "AND LOWER(pmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND pmd.id > :idOffset ORDER BY pmd.id")
+    List<PluginMetaDataEntity> findAllTenantPluginsByTenantId(@Param("tenantId") UUID tenantId,
                                                               @Param("nullTenantId") UUID nullTenantId,
                                                               @Param("textSearch") String textSearch,
-                                                              @Param("idOffset") UUID idOffset);
+                                                              @Param("idOffset") UUID idOffset,
+                                                              Pageable pageable);
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java
index 1ad16e2..b21b20d 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/JpaBaseRuleDao.java
@@ -17,6 +17,7 @@ package org.thingsboard.server.dao.sql.rule;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.id.RuleId;
@@ -31,6 +32,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@@ -73,10 +75,10 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
         List<RuleMetaDataEntity> entities =
                 ruleMetaDataRepository
                         .findByTenantIdAndPageLink(
-                                pageLink.getLimit(),
                                 tenantId.getId(),
-                                pageLink.getTextSearch(),
-                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
+                                Objects.toString(pageLink.getTextSearch(), ""),
+                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                                new PageRequest(0, pageLink.getLimit()));
         if (log.isTraceEnabled()) {
             log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
         } else {
@@ -91,11 +93,11 @@ public class JpaBaseRuleDao extends JpaAbstractSearchTextDao<RuleMetaDataEntity,
         List<RuleMetaDataEntity> entities =
                 ruleMetaDataRepository
                         .findAllTenantRulesByTenantId(
-                                pageLink.getLimit(),
                                 tenantId,
                                 NULL_UUID,
-                                pageLink.getTextSearch(),
-                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset());
+                                Objects.toString(pageLink.getTextSearch(), ""),
+                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                                new PageRequest(0, pageLink.getLimit()));
 
         if (log.isTraceEnabled()) {
             log.trace("Search result: [{}]", Arrays.toString(entities.toArray()));
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java
index 9336e69..694a364 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/rule/RuleMetaDataRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.rule;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -32,20 +33,20 @@ public interface RuleMetaDataRepository extends CrudRepository<RuleMetaDataEntit
 
     List<RuleMetaDataEntity> findByPluginToken(String pluginToken);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID = :tenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<RuleMetaDataEntity> findByTenantIdAndPageLink(@Param("limit") int limit,
-                                                       @Param("tenantId") UUID tenantId,
+    @Query("SELECT rmd FROM RuleMetaDataEntity rmd WHERE rmd.tenantId = :tenantId " +
+            "AND LOWER(rmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND rmd.id > :idOffset ORDER BY rmd.id")
+    List<RuleMetaDataEntity> findByTenantIdAndPageLink(@Param("tenantId") UUID tenantId,
                                                        @Param("textSearch") String textSearch,
-                                                       @Param("idOffset") UUID idOffset);
+                                                       @Param("idOffset") UUID idOffset,
+                                                       Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM RULE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<RuleMetaDataEntity> findAllTenantRulesByTenantId(@Param("limit") int limit,
-                                                          @Param("tenantId") UUID tenantId,
+    @Query("SELECT rmd FROM RuleMetaDataEntity rmd WHERE rmd.tenantId IN (:tenantId, :nullTenantId) " +
+            "AND LOWER(rmd.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND rmd.id > :idOffset ORDER BY rmd.id")
+    List<RuleMetaDataEntity> findAllTenantRulesByTenantId(@Param("tenantId") UUID tenantId,
                                                           @Param("nullTenantId") UUID nullTenantId,
                                                           @Param("textSearch") String textSearch,
-                                                          @Param("idOffset") UUID idOffset);
+                                                          @Param("idOffset") UUID idOffset,
+                                                          Pageable pageable);
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java
index ddd6f7d..4384362 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/JpaTenantDao.java
@@ -16,6 +16,7 @@
 package org.thingsboard.server.dao.sql.tenant;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.Tenant;
@@ -27,6 +28,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 import org.thingsboard.server.dao.tenant.TenantDao;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@@ -55,9 +57,9 @@ public class JpaTenantDao extends JpaAbstractSearchTextDao<TenantEntity, Tenant>
     public List<Tenant> findTenantsByRegion(String region, TextPageLink pageLink) {
         return DaoUtil.convertDataList(tenantRepository
                 .findByRegionNextPage(
-                        pageLink.getLimit(),
                         region,
-                        pageLink.getTextSearch(),
-                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                        Objects.toString(pageLink.getTextSearch(), ""),
+                        pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                        new PageRequest(0, pageLink.getLimit())));
     }
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java
index 10f58b3..ffb28e0 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/tenant/TenantRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.tenant;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -30,11 +31,11 @@ import java.util.UUID;
 @SqlDao
 public interface TenantRepository extends CrudRepository<TenantEntity, UUID> {
 
-    @Query(nativeQuery = true, value = "SELECT * FROM TENANT WHERE REGION = :region " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<TenantEntity> findByRegionNextPage(@Param("limit") int limit,
-                                            @Param("region") String region,
+    @Query("SELECT t FROM TenantEntity t WHERE t.region = :region " +
+            "AND LOWER(t.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND t.id > :idOffset ORDER BY t.id")
+    List<TenantEntity> findByRegionNextPage(@Param("region") String region,
                                             @Param("textSearch") String textSearch,
-                                            @Param("idOffset") UUID idOffset);
+                                            @Param("idOffset") UUID idOffset,
+                                            Pageable pageable);
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/JpaTimeseriesDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/JpaTimeseriesDao.java
index 7df7605..bc056e1 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/JpaTimeseriesDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/timeseries/JpaTimeseriesDao.java
@@ -15,12 +15,15 @@
  */
 package org.thingsboard.server.dao.sql.timeseries;
 
+import com.google.common.base.Function;
 import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.id.EntityId;
+import org.thingsboard.server.common.data.kv.Aggregation;
 import org.thingsboard.server.common.data.kv.TsKvEntry;
 import org.thingsboard.server.common.data.kv.TsKvQuery;
 import org.thingsboard.server.dao.DaoUtil;
@@ -31,7 +34,9 @@ import org.thingsboard.server.dao.model.sql.TsKvLatestEntity;
 import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
 import org.thingsboard.server.dao.timeseries.TimeseriesDao;
 
+import javax.annotation.Nullable;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Component
 @Slf4j
@@ -46,12 +51,34 @@ public class JpaTimeseriesDao extends JpaAbstractDaoListeningExecutorService imp
 
     @Override
     public ListenableFuture<List<TsKvEntry>> findAllAsync(EntityId entityId, List<TsKvQuery> queries) {
-        // TODO - Add implementation
-        return service.submit(() -> null);
+        List<ListenableFuture<List<TsKvEntry>>> futures = queries
+                .stream()
+                .map(query -> findAllAsync(entityId, query))
+                .collect(Collectors.toList());
+        return Futures.transform(Futures.allAsList(futures), new Function<List<List<TsKvEntry>>, List<TsKvEntry>>() {
+            @Nullable
+            @Override
+            public List<TsKvEntry> apply(@Nullable List<List<TsKvEntry>> results) {
+                if (results == null || results.isEmpty()) {
+                    return null;
+                }
+                return results.stream()
+                        .flatMap(List::stream)
+                        .collect(Collectors.toList());
+            }
+        }, service);
     }
 
     private ListenableFuture<List<TsKvEntry>> findAllAsync(EntityId entityId, TsKvQuery query) {
-        return null;
+        if (query.getAggregation() == Aggregation.NONE) {
+            return findAllAsyncWithLimit(entityId, query);
+        } else {
+            return service.submit(() -> null);
+        }
+    }
+
+    private ListenableFuture<List<TsKvEntry>> findAllAsyncWithLimit(EntityId entityId, TsKvQuery query) {
+        return service.submit(() -> null);
     }
 
     @Override
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
index d4308cf..64ea0b4 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/JpaUserDao.java
@@ -16,6 +16,7 @@
 package org.thingsboard.server.dao.sql.user;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.User;
@@ -24,11 +25,11 @@ import org.thingsboard.server.common.data.security.Authority;
 import org.thingsboard.server.dao.DaoUtil;
 import org.thingsboard.server.dao.annotation.SqlDao;
 import org.thingsboard.server.dao.model.sql.UserEntity;
-import org.thingsboard.server.dao.sql.JpaAbstractDao;
 import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 import org.thingsboard.server.dao.user.UserDao;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@@ -66,9 +67,9 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
                                 tenantId,
                                 NULL_UUID,
                                 pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
-                                pageLink.getTextSearch(),
-                                Authority.TENANT_ADMIN.name(),
-                                pageLink.getLimit()));
+                                Objects.toString(pageLink.getTextSearch(), ""),
+                                Authority.TENANT_ADMIN,
+                                new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
@@ -79,9 +80,9 @@ public class JpaUserDao extends JpaAbstractSearchTextDao<UserEntity, User> imple
                                 tenantId,
                                 customerId,
                                 pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
-                                pageLink.getTextSearch(),
-                                Authority.CUSTOMER_USER.name(),
-                                pageLink.getLimit()));
+                                Objects.toString(pageLink.getTextSearch(), ""),
+                                Authority.CUSTOMER_USER,
+                                new PageRequest(0, pageLink.getLimit())));
 
     }
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
index 128f45f..ebeb612 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/user/UserRepository.java
@@ -15,9 +15,11 @@
  */
 package org.thingsboard.server.dao.sql.user;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
+import org.thingsboard.server.common.data.security.Authority;
 import org.thingsboard.server.dao.annotation.SqlDao;
 import org.thingsboard.server.dao.model.sql.UserEntity;
 
@@ -32,15 +34,15 @@ public interface UserRepository extends CrudRepository<UserEntity, UUID> {
 
     UserEntity findByEmail(String email);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM TB_USER WHERE TENANT_ID = :tenantId " +
-            "AND CUSTOMER_ID = :customerId AND AUTHORITY = :authority " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%'))" +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
+    @Query("SELECT u FROM UserEntity u WHERE u.tenantId = :tenantId " +
+            "AND u.customerId = :customerId AND u.authority = :authority " +
+            "AND LOWER(u.searchText) LIKE LOWER(CONCAT(:searchText, '%'))" +
+            "AND u.id > :idOffset ORDER BY u.id")
     List<UserEntity> findUsersByAuthority(@Param("tenantId") UUID tenantId,
                                           @Param("customerId") UUID customerId,
                                           @Param("idOffset") UUID idOffset,
                                           @Param("searchText") String searchText,
-                                          @Param("authority") String authority,
-                                          @Param("limit") int limit);
+                                          @Param("authority") Authority authority,
+                                          Pageable pageable);
 
 }
\ No newline at end of file
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
index a3c06f1..0e7c0f8 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDao.java
@@ -16,6 +16,7 @@
 package org.thingsboard.server.dao.sql.widget;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.stereotype.Component;
 import org.thingsboard.server.common.data.page.TextPageLink;
@@ -27,6 +28,7 @@ import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
 import org.thingsboard.server.dao.widget.WidgetsBundleDao;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.UUID;
 
 import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID;
@@ -61,10 +63,10 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
         return DaoUtil.convertDataList(
                 widgetsBundleRepository
                         .findSystemWidgetsBundles(
-                                pageLink.getLimit(),
                                 NULL_UUID,
-                                pageLink.getTextSearch(),
-                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                                Objects.toString(pageLink.getTextSearch(), ""),
+                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                                new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
@@ -72,10 +74,10 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
         return DaoUtil.convertDataList(
                 widgetsBundleRepository
                         .findTenantWidgetsBundlesByTenantId(
-                                pageLink.getLimit(),
                                 tenantId,
-                                pageLink.getTextSearch(),
-                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                                Objects.toString(pageLink.getTextSearch(), ""),
+                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                                new PageRequest(0, pageLink.getLimit())));
     }
 
     @Override
@@ -83,10 +85,10 @@ public class JpaWidgetsBundleDao extends JpaAbstractSearchTextDao<WidgetsBundleE
         return DaoUtil.convertDataList(
                 widgetsBundleRepository
                         .findAllTenantWidgetsBundlesByTenantId(
-                                pageLink.getLimit(),
                                 tenantId,
                                 NULL_UUID,
-                                pageLink.getTextSearch(),
-                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset()));
+                                Objects.toString(pageLink.getTextSearch(), ""),
+                                pageLink.getIdOffset() == null ? NULL_UUID : pageLink.getIdOffset(),
+                                new PageRequest(0, pageLink.getLimit())));
     }
 }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
index 34f167d..9a60ec0 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java
@@ -15,6 +15,7 @@
  */
 package org.thingsboard.server.dao.sql.widget;
 
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
@@ -32,28 +33,28 @@ public interface WidgetsBundleRepository extends CrudRepository<WidgetsBundleEnt
 
     WidgetsBundleEntity findWidgetsBundleByTenantIdAndAlias(UUID tenantId, String alias);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :systemTenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:searchText, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("limit") int limit,
-                                                       @Param("systemTenantId") UUID systemTenantId,
+    @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :systemTenantId " +
+            "AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:searchText, '%')) " +
+            "AND wb.id > :idOffset ORDER BY wb.id")
+    List<WidgetsBundleEntity> findSystemWidgetsBundles(@Param("systemTenantId") UUID systemTenantId,
                                                        @Param("searchText") String searchText,
-                                                       @Param("idOffset") UUID idOffset);
+                                                       @Param("idOffset") UUID idOffset,
+                                                       Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID = :tenantId " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
-                                                                 @Param("tenantId") UUID tenantId,
+    @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId = :tenantId " +
+            "AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND wb.id > :idOffset ORDER BY wb.id")
+    List<WidgetsBundleEntity> findTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId,
                                                                  @Param("textSearch") String textSearch,
-                                                                 @Param("idOffset") UUID idOffset);
+                                                                 @Param("idOffset") UUID idOffset,
+                                                                 Pageable pageable);
 
-    @Query(nativeQuery = true, value = "SELECT * FROM WIDGETS_BUNDLE WHERE TENANT_ID IN (:tenantId, :nullTenantId) " +
-            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(:textSearch, '%')) " +
-            "AND ID > :idOffset ORDER BY ID LIMIT :limit")
-    List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("limit") int limit,
-                                                                    @Param("tenantId") UUID tenantId,
+    @Query("SELECT wb FROM WidgetsBundleEntity wb WHERE wb.tenantId IN (:tenantId, :nullTenantId) " +
+            "AND LOWER(wb.searchText) LIKE LOWER(CONCAT(:textSearch, '%')) " +
+            "AND wb.id > :idOffset ORDER BY wb.id")
+    List<WidgetsBundleEntity> findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId,
                                                                     @Param("nullTenantId") UUID nullTenantId,
                                                                     @Param("textSearch") String textSearch,
-                                                                    @Param("idOffset") UUID idOffset);
+                                                                    @Param("idOffset") UUID idOffset,
+                                                                    Pageable pageable);
 }
diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java
index ad0c9cf..2651854 100644
--- a/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java
+++ b/dao/src/test/java/org/thingsboard/server/dao/sql/alarm/JpaAlarmDaoTest.java
@@ -18,6 +18,7 @@ package org.thingsboard.server.dao.sql.alarm;
 import com.google.common.util.concurrent.ListenableFuture;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
 import org.thingsboard.server.common.data.EntityType;
 import org.thingsboard.server.common.data.alarm.Alarm;
 import org.thingsboard.server.common.data.alarm.AlarmId;
@@ -59,7 +60,7 @@ public class JpaAlarmDaoTest extends AbstractJpaDaoTest {
         saveAlarm(alarm3Id, tenantId, originator2Id, "TEST_ALARM");
         assertEquals(3, alarmDao.find().size());
         AlarmEntity alarmEntity = alarmRepository.findLatestByOriginatorAndType(
-                tenantId, originator1Id, EntityType.DEVICE.ordinal(), "TEST_ALARM");
+                tenantId, originator1Id, EntityType.DEVICE, "TEST_ALARM", new PageRequest(0, 1)).get(0);
         assertNotNull(alarmEntity);
         ListenableFuture<Alarm> future = alarmDao
                 .findLatestByOriginatorAndType(new TenantId(tenantId), new DeviceId(originator1Id), "TEST_ALARM");
diff --git a/dao/src/test/resources/jpa-test.properties b/dao/src/test/resources/jpa-test.properties
index 58ca25f..80ae6ff 100644
--- a/dao/src/test/resources/jpa-test.properties
+++ b/dao/src/test/resources/jpa-test.properties
@@ -7,4 +7,8 @@ spring.jpa.hibernate.ddl-auto=validate
 
 spring.datasource.url=jdbc:postgresql://localhost:5432/thingsboard
 spring.datasource.username=postgres
-spring.datasource.password=postgres
\ No newline at end of file
+spring.datasource.password=postgres
+
+#spring.datasource.url=jdbc:h2:mem:test;MODE=PostgreSQL
+#spring.datasource.schema=classpath:postgres/schema.sql
+#spring.datasource.data=classpath:postgres/system-data.sql;classpath:system-test.sql
\ No newline at end of file