akshay
akshay

Reputation: 5285

problem with HQL update

When I try to execute the following HQL query:

Query  query =  getSession().createQuery("update XYZ set status = 10");
query.executeUpdate();

I get this exception:

Exception in thread "main" org.hibernate.QueryException: query must begin with SELECT or FROM: update

EDIT:
I also tried following .But it doennot work either.

org.hibernate.Query  query =  getSession().createQuery("update XYZ t set t.status = 10");

EDIT2: Making changes in hinbernate.cfg.xml solved my problem Earlier i was using

setting hibernate.query.factory_class"   = org.hibernate.hql.classic.ClassicQueryTranslatorFactor

Now am using following property

<property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>

Upvotes: 9

Views: 5748

Answers (5)

Bibin Mathew
Bibin Mathew

Reputation: 31

Use

hibernate.query.factory_class = org.hibernate.hql.ast.ASTQueryTranslatorFactory

in hibernate.cfg.xml file to resolve exception:

org.hibernate.QueryException: query must begin with SELECT or FROM: update.....

Upvotes: 0

atrain
atrain

Reputation: 9265

The question is thinking in SQL, when you should be thinking in objects:

XYZ xyz = new XYZ();
xyz.setStatus(10);
getSession().merge(xyz);

Upvotes: 3

Hardik Mishra
Hardik Mishra

Reputation: 14887

Session sesssion = getSession(); //getter for session

For HQL :

String hql = "update Activity " +
"set startedOn = :taskStartedOn " +
"where id = :taskId";

Query query = session.createQuery(hql);
query.setDate("taskStartedOn",new Date());
query.setLong("taskId",1)
int rowCount = query.executeUpdate();

Here Activity is POJO.

Upvotes: 0

NimChimpsky
NimChimpsky

Reputation: 47300

Thats not an HQL query. You want to import javax.persistence.Query which allows normal sql, not org.hibernate.Query which works on entity objects.

If you want to use simple sql, you could also use PreparedStatement

However, if you really want to use hibernate, without taking advantage of entityobjects (totally defeating the point of using hibernate in the first place, imho) you could do it like this (reference docs):

String myUpdate = "update XYZ myAlias set myAlias.status = :newStatus";
// or String noAliasMyUpdate = "update XYZ set status = :newStatus";
int updatedEntities = getSession().createQuery(myUpdate) //or noAliasMyUpdate
        .setInt( "newStatus", 10 )
        .executeUpdate();

Upvotes: 5

ssedano
ssedano

Reputation: 8432

Try:

Query  query =  getSession().createQuery("update XYZ o set o.status = 10");
query.executeUpdate();

Take a look at this also.

Upvotes: 0

Related Questions