Unexpected Token Exception in SQL Query in #Query() annotation in Spring - mysql

I am using a long SQL Query String inside #Query() annotation in Spring. I'm getting exceptions for multiple tokens. Can anybody provide the solution for the query below:
#Query("select p, top5.duration_seconds / 60 as duration_minutes, top5.max_seconds / 60 as max_minutes " +
"from (select r.driver_id, "+
"sum(to_seconds(r.end_time) - to_seconds(r.start_time)) as duration_seconds, "+
"max(to_seconds(r.end_time) - to_seconds(r.start_time)) as max_seconds "+
"from ride r "+
"where r.start_time >= '2018-08-08T12:12:12' and "+
"r.end_time <= '2018-08-08T18:12:12' "+
"group by r.driver_id "+
"order by duration_seconds desc "+
"limit 5 "+
") top5 join "+
"person p "+
"on top5.driver_id = p.id")
It shows
UnExpectedToken: sum
antlr.NoViableAltException: unexpected token: (
antlr.MismatchedTokenException: expecting EOF, found ')'

Related

Mysql Query With Like Operator and order by keyword giving empty records in spring boot api

native Query I Wrote in My Repository
If i remove order by condition in the below query , it is giving some records but i want it in some order so i added order by condition then it not showing records only . but the same mysql query with order by condition is giving some records in mysql workbench.
#Query(value = "SELECT l.id AS id,l.first_name AS firstName,l.last_name AS lastName,"
+ " l.email AS email,l.phone AS phone,l.place AS place,l.course_id AS courseId,"
+ " c.name AS courseName,l.source AS source,l.enquiry_for AS enquiryFor,"
+ " l.appointment_date AS appointmentDate,l.description AS description,"
+ " l.discount AS discount,l.status AS status,l.assignee_id AS assigneeId,"
+ " ase.first_name AS assigneeFirstName,ase.last_name AS assigneeLastName,"
+ " l.assignor_id AS assignorId,asr.first_name AS assignorFirstName,"
+ " asr.last_name AS assignorLastName,l.active AS active,l.created_date AS createdDate,"
+ " l.updated_date AS updatedDate,(SELECT comments FROM reviews where created_date IN"
+ " (SELECT MAX(created_date) from reviews where lead_id=l.id)) AS latestComment FROM "
+ " leads l JOIN users AS ase ON l.assignee_id = ase.id JOIN users AS asr ON "
+ " l.assignor_id = asr.id JOIN courses AS c ON l.course_id =c.id WHERE l.status!='Draft'"
+ " AND (l.first_name LIKE '%:keyword%' OR l.last_name LIKE '%:keyword%' OR l.phone LIKE"
+ " '%:keyword%') ORDER BY -l.appointment_date DESC,l.created_date ASC", nativeQuery=true)
List<Leads> searchLeadsForAdmin(#Param("keyword") String searchKeyword);
i don't know Where am i going wrong , attached image below mysql query result came in workbench.
I found the answer to my question. It was a concatenation issue. In the second last line of my query after 'l.phone LIKE' I added the value in the next line.
+ " AND l.first_name LIKE %:keyword% OR l.last_name LIKE %:keyword% OR "
+ " l.phone LIKE %:keyword% ORDER BY -l.appointment_date DESC,"
+ " l.created_date ASC", nativeQuery = true)
The above query works.

unable to evaluate the expression method threw 'java.lang.illegalargumentexception' exception while excuting the flexible search query

hai i am getting products details from db while exceuting the flexiblesearchservice.search(query) it is throwing this error.my flexible search query is working fine with hac. but throwing error from flexible search service. my query and service is shown below.
"({{select {p:"+ProductModel.PK+"} from { "+ OrderModel._TYPECODE +" as o " +
" join "+ OrderStatus._TYPECODE+" as os on {os:pk} = {o:"+OrderModel.STATUS+"}"+
" join "+ OrderEntryModel._TYPECODE +" as oe on {oe:"+ OrderEntryModel.ORDER +"} = {o:"+OrderModel.PK+"}"+
" join "+ ProductModel._TYPECODE +" as p on {oe:"+OrderEntryModel.PRODUCT+"} = {p:"+ProductModel.PK+"}"+
" join "+ CatalogVersionModel._TYPECODE+" as cv on { p:"+ProductModel.CATALOGVERSION +"} = {cv:"+CatalogVersionModel.PK+"}"+
" join "+ CatalogModel._TYPECODE +" as c on {p:"+ProductModel.CATALOG+"} = {c:"+CatalogModel.PK+"}} "+
"where {os:code}='"+OrderStatus.COMPLETED +"' and {"+OrderModel.DATE+"}>'2017-08-16 00:00:00.000' " +
"and {"+OrderModel.DATE+"}<'2020-09-30 00:00:00.000' " +
"and {cv:"+CatalogVersionModel.VERSION+"}= 'Online' " +
"and {c:"+CatalogModel.ID+"} like 'apparelProductCatalog' " +
"group by {p:"+ProductModel.PK+"} order by sum({oe:"+OrderEntryModel.QUANTITY+"}) desc" +
" limit 10 }})";
final FlexibleSearchQuery fQuery = new FlexibleSearchQuery(QUERY);
fQuery.setResultClassList(Arrays.asList(ProductModel.class));
final SearchResult<ProductModel> searchResult =flexibleSearchService.search(fQuery);
final List<ProductModel> productModelList= searchResult.getResult();```
**error:** unable to evaluate the expression method threw 'java.lang.illegalargumentexception' exception
please help me out.
"where {os:code}='"+OrderStatus.COMPLETED +"'
This above code may be the issue, OrderStatus.COMPLETED returns an object, not String.
You can pass it as a query parameter.
"where {os:code} = '" + OrderStatus.COMPLETED.getCode() +"'

[21000][1242] Subquery returns more than 1 row

My Query:
entityManager.createQuery("SELECT " +
"q.id, " +
"q.title, " +
"q.user.fullName, " +
"q.user.reputationCount, " +
"q.viewCount, " +
"q.countValuable, " +
"q.persistDateTime, " +
"t.id, " +
"t.name, " +
"t.description, " +
"(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) " +
"FROM Question q JOIN q.tags t")
Here I get the error - [21000][1242] Subquery returns more than 1 row
By the method of exceptions, I determined that the error in this query string:
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
How to make the correct request so that there is no this error? Thank!
Two common ways are aggregation and limiting:
(SELECT MAX(a.isHelpful) FROM Answer a WHERE a.question.id = q.id)
(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id LIMIT 1)
However, those are really just hacks to get around an "issue" with the data. I put issue in quotes, but the real issue is probably your understanding of data and not the data itself.
You should understand why there are duplicates. Then decide which value you want. And implement the correct logic for what you want.
Subquery returns more than 1 row, this simply means that your query is not returning a single row for the outer select statement to work.
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
you have to apply a set of conditions to filter out your data uniquely or use joins to combine your table Answer and Question and then filter data accordingly.
you can also group each row data in one column by GROUP_CONCAT Mysql function like this :
"(SELECT GROUP_CONCAT(a.isHelpful) FROM Answer a WHERE a.question.id = q.id) "
Although GROUP_CONCAT is not available in Mysql, for that you can also bind SQL function in hibernate as described in this post.
After a day of various trial and error, I found the following solution, I hope someone will broaden their horizons and help in solving their problem:
entityManager.createQuery("SELECT " +
"q.id, " +
"q.title, " +
"q.user.fullName, " +
"q.user.reputationCount, " +
"q.viewCount, " +
"q.countValuable, " +
"q.persistDateTime, " +
"t.id, " +
"t.name, " +
"t.description, " +
"(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
"(SELECT CASE WHEN MAX (a.isHelpful) > 0 THEN true ELSE false END FROM Answer a WHERE a.question.id = q.id) " +
"FROM Question q JOIN q.tags t")

Subquery returns more than 1 row - netbeans & mysql

can you check my code?
INSERT INTO tbl_bed
(status,wardID,roomID)
VALUES ('"+ cb_bedStatus.getSelectedItem() +"',
(SELECT wardID FROM tbl_ward
WHERE wardName='"+ cb_wardname.getSelectedItem().toString() +"'
AND category='"+ cb_ward.getSelectedItem().toString() +"'),
(SELECT roomID FROM tbl_room
WHERE roomNo='"+ cb_roomNo.getSelectedItem().toString() +"'))
I got this error when i run the program "Subquery returns more than 1 row".
Im using netbeans & mysql.
You could use
sql = "INSERT INTO tbl_bed (status, wardID, roomID) "
+ "SELECT '"+ cb_bedStatus.getSelectedItem() +"', b.wardID, c.roomID "
+ "FROM tbl_ward b, tbl_room c "
+ "WHERE b.wardName='"+ cb_wardname.getSelectedItem().toString() +"' "
+ "AND b.category='"+ cb_ward.getSelectedItem().toString() +"' "
+ "AND c.roomNo='"+ cb_roomNo.getSelectedItem().toString() +"' "
if there is no risk of SQL injection attacks. Otherwise, put the same SQL into a prepared statement.

how to convert the query to hibernate query language?

how to write this query in hibernate query language
select * from preferred_space p, building b, floor f, space_type st, space s
where p.user_id=11
and p.space_id=s.id
and s.building_id=b.id
and s.floor_id=f.id
and s.space_type_id=st.id
order by p.id;
If I do it this way it is showing me an error?
String sql = "from PreferredSpace p, Space s, Building b, Floor f, SpaceType st " +
"where p.userId = ? " +
"and p.spaceId = s.id" +
"and s.buildingId = b.id" +
"and s.floorId = f.id" +
"and s.spaceTypeId = st.id" +
"order by p.id";
error:
ERROR o.h.hql.internal.ast.ErrorCounter - line 1:242: unexpected token: s
16:18:17.569 [http-bio-8080-exec-24] ERROR o.h.hql.internal.ast.ErrorCounter - line 1:242: unexpected token: s
antlr.NoViableAltException: unexpected token: s
shows the same error for every row that starts with "s." and also for "by".
You need to add spaces:
String sql = "from PreferredSpace p, Space s, Building b, Floor f, SpaceType st " +
"where p.userId = ? " +
"and p.spaceId = s.id " +
"and s.buildingId = b.id " +
"and s.floorId = f.id " +
"and s.spaceTypeId = st.id " +
"order by p.id";