#query with only sort by . Without limit - java

I`m trying to do select with #Query annotation with only sort by.
I searched a lot but without any luck. Currently I implemented it to work but with Pageable class that want me to set limit . Is there any other way to accomplish that without limit? Only normal select with order by
#Query("SELECT new com.concretepage.entity.Employee(employeeId,firstName,lastName,salary)FROM Employee")
List<Employee> getBySalaryOrdered(Pageable pageable);
I`m searching for way to do it without Pageable. I want only to have sort without any limits

Instead of using #Query annotation you could use query generation based on a method definition inside the interface that extends CrudRepository or JpaRepository.
In your case, it would be:
List<Employee> findAllByOrderBySalaryAsc();
Check docs for more.

Related

Not Equals Query on Spring Boot REST/JPA Service

I'm brand new to Spring Boot, and I've created a very basic REST service that uses JPA, and exposes the RepositoryRestResource for CRUD and query operations on my model:
#RepositoryRestResource
public interface CatalogueOrderRepository extends JpaRepository<CatalogueOrder, Long>,
QuerydslPredicateExecutor<CatalogueOrder> {
}
Using this, I'm able to perform queries that involve searching for values, pagination, and ordering, for instance:
?page=0&size=5&sort=priority,desc&orderStatus=submitted
Is it possible to search for values that are not equal, without any additional work? For instance, all orders where the orderStatus is NOT equal to 'submitted'.
I notice that the Predicate interface has a not() method, though I'm not sure if it's related.
For such cases you should do some work. There are different approaches to do that. See Spring docs and examples about JPA.
E.g. you can use #Query or specifications.
You can try "Query creation from method names".
Let's say you want to search Orders by orderstatus <> submitted,
List<Order> findByOrderstatusNot(String orderstatus);

Which is faster custom query using #Query vs findAll() thru CrudRepository?

I was writing Java code to get all the rows from the database table.
I was using CrudRepository and used this method below.
public interface StudentRepository extends CrudRepository<Student, Long>
{
public List<Student> findById(long id);
}
or
#Query(value = "SELECT s FROM Student s")
List<Student> customMethod(long id);
Which method is faster? Does Java internal method provide faster than our custom query?
Thanks in advance.
The default findById provided by Spring Data Repository and a query-annotated method have significantly different semantics. But, to keep it short, I will try to focus on differences in performance exclusively.
Unless you have query cache enabled, a query-annotated method will always hit the database with a query.
findById, on the other hand, ultimately calls EntityManager.find(). EntityManager.find() looks up the entity in the persistence context first. That means if the entity has already been loaded into the context, the call will not hit the underlying database.
As a side note, if you're curious as to how Spring implements the default repository methods, have a look at the source of SimpleJpaRepository.
You have to understand that findAll() method eventually generates the query for the selection. The only way to prove that is to test it. I don't think you will gain a significant performance boost. JPA's, on another hand, query generation is extremely easy to understand and use. So, if you hesitate between using one or the other, I would stick to findAll() JPA or spring data repository methods.

Spring Data Rest search by keyword

I'm trying to find the solution for implementing search by keyword. Final API should look like /persons/search?keyword=test. The search should check several columns of persons table (firstName, lastName, school, ...).
In the result list, I need to have the list of persons which contains keyword at least in one column.
What will be the best solution to implement that by using Spring Data Rest?
Using #Query annotation on a repository, you can do something like this:
public interface PersonRepository extends CrudRepository<Persons, Long> {
#Query("SELECT p FROM Persons where LOWER(p.firstname) like :key%"
+ " or LOWER(p.lastname) like :key%" )
public List<Person> searchBy(#Param("word") String key);
}
NOTE: I did a similar thing, but I do not have the exact code right now, so just check out the syntax, but what I was able to achieve with this was the ability to search on multiple columns with a single key.

findBy with custom filter in PagingAndSortingRepository

I have an interface extending the PagingAndSortingRepository
I have a custom find like :
findJobByNameBySystemIdUserCompanyId(companyId, pageable)
This works fine, now I want to introduce filtering, so I want to search (like) for string in the list.
How can I achieve that? The search term could be on any field ?
Please have a look here:
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
example: findByFirstnameLike(...), findByFirstnameNotLike(...)

Hibernate filtering query collections

I would like to ask if it's possible to do this using hibernate.
Let say I have already run a HQL and retrieved a collection. Is it possible to further filter it using hibernate?
I tried to use the <filter> to the header class and add session.enable() before the query, but seems it's not working.
Sample code
Query search = session.getNamedQuery(HQL_SOMEDEFAULTQUERY);
List results = search.list();
//further filtering ...
Stripped down HQL
select h
from flow as f
join f.item as i
join i.header as h
where i.status = :status
and f.staff = :staff
order by i.prId desc
No. At least, not the way you asked. Once you ask Hibernate to hit the database (with the list() method), Hibernate did its part and the results are now in your hands. You can implement a filtering logic in your code to post-process the results.
That said, it is possible to filter the results in the query itself. If you define a Hibernate filter and enable it for a specific model/query, you'd be able to keep your original HQL query and Hibernate will append it with extra where clauses to further filter the results. See this:
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/filters.html
The better way would be to use Criteria. Here is an example from Hibernate Documentation that explains usage of Criteria.
Criteria would be used before you call list method.
Hope that helps.

Categories