我试着用普通的方法写但不能执行
确定应该为联合主键识别问题
请问要更新s如下session.createQuery里的HQL语句怎么写Session session = sf.getCurrentSession();
session.beginTransaction();
SSDoublePK spk2 = new SSDoublePK();
spk2.setId(1);
spk2.setSn("aaabbb");
SS s = (SS)session.load(SS.class,spk2);
System.out.println(s.getName()); //已取得数据
spk2.setId(3);
spk2.setSn("yyy229399");
Query q = session.createQuery("update Student s set s.spk=spk2,s1.name='bbbbb' where s.spk.id=2");
q.executeUpdate();
Exceptionorg.hibernate.QueryException: could not resolve property: spk of: garrick.com.Student [update garrick.com.Student s set s.spk=spk2,s1.name='bbbbb' where s.spk.id=2]
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1375)
at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:304)
at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:410)
at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:617)
at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:263)
at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:210)
at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117)
at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113)
at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:854)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.assignment(HqlSqlBaseWalker.java:1075)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.setClause(HqlSqlBaseWalker.java:766)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.updateStatement(HqlSqlBaseWalker.java:361)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:239)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1651)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
at $Proxy12.createQuery(Unknown Source)
at garrick.com.CRUDSS01Test.testCRUD(CRUDSS01Test.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

解决方案 »

  1.   

    Query q = session.createQuery("update Student s set s.spk=spk2,s1.name='bbbbb' where s.spk.id=2");
    你的s1是什么,这样写肯定找不到属性的吧?,你的spk 与name 都应该是Student 这个POJO类的属性才成
      

  2.   


    你这语句好混乱。 spk2是个变量,应该不能出现在双引号中当个字符串吧! uupdate Student s  定义表的别名是s  怎么后面出现 s1.nam='bbbbb'呢?s1是啥玩意?
      

  3.   

    s1.name='bbbbb'这写错了是s.name='bbbbb'
    另我就是不知道改动联合主键的设置方法
    s.spk=spk2这段该怎么改请教
      

  4.   

    Query q = session.createQuery("update Student s set s.spk=spk2,s1.name='bbbbb' where s.spk.id=2");这样写肯定不对的。lz可以参考下http://hi.baidu.com/fytcm/blog/item/5124737b38ea56fe0bd187fa.html
      

  5.   

    4楼提供的方法我知道这么做
    我现在的问题是怎么用HQL达成只有更动的数据才帮我写到数据库
    举例:s的name属性改了就只更动这个s对象在数据库里的name字段不会更新其他属性
      

  6.   

    你需要在影射文件里设置动态插入或动态更新属性。
    同时你给的例子修改了主键,这个貌似使用hibernate是不可以的,如果你需要修改主键你需要使用SQL。
      

  7.   

    先从数据库中查出最新的数据对象 然后将更改的name属性设置到这个查询出来的对象上
    然后 update(查出的对象)
    或者 直接用session.createSQLQuery(sql).executeUpdate();执行SQL语句修改
      

  8.   

    set s.spk=spk2!!!!
    不可以这么做的吧
      

  9.   


    经过实际测试,可以修改复合主键。下面给出一个例子:仅供参考@Embeddable
    public class AuthorKey implements Serializable {
    private static final long serialVersionUID = 7631063156562716736L; private String name; private int id; public AuthorKey() {
    } public AuthorKey(String name, int id) {
    this.name = name;
    this.id = id;
    }
    //省略get/set
    }
    @Entity
    @Table(name = "mybatis3_author")
    public class Authors implements Serializable { private static final long serialVersionUID = -4916783193566040682L; @Id
    private AuthorKey id; //@Column(name = "id")
    private int age; @Temporal(TemporalType.TIMESTAMP)
    private Date loginDate;
    //省略get/set
    }public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
    try {
    sessionFactory = new Configuration().configure()
    .buildSessionFactory();
    } catch (Throwable ex) {
    // Log exception!
    throw new ExceptionInInitializerError(ex);
    }
    } public static Session getSession() throws HibernateException {
    return sessionFactory.openSession();
    } public static void main(String[] args) {
    Session session = HibernateUtil.getSession();
    Transaction ctx = session.beginTransaction();
    ctx.begin();
    AuthorKey ak = new AuthorKey("朱自清", 3);
    Authors au = (Authors) session.load(Authors.class, ak);
    System.out.println(au.getId().getName() + " | " + au.getId().getId()
    + " | " + au.getAge() + " | " + au.getLoginDate()); try {
    Query q = session
    .createQuery(" update Authors s set s.id.id = ?, s.id.name = ? where id.name = '朱自清' and id.id=3");
    q.setInteger(0, 4); //注意这里,虽然可以修改,但由于ID在数据库中为主键,因此在更新时需要确认该字段不重复
    q.setString(1, "朱自清");
    //q.setEntity("cls", new AuthorKey("朱自清", 3));
    int i = q.executeUpdate();
    System.out.println("更新条数-------->" + i);
    ctx.commit();
    } catch (Exception e) {
    e.printStackTrace();
    ctx.rollback();
    } finally {
    session.flush();
    session.close();
    } Session session1 = HibernateUtil.getSession();
    Query query = session1.createQuery(" from Authors");
    List<Authors> list = query.list();
    for (Authors a : list) {
    System.out.println(a.getId().getName() + " | " + a.getId().getId()
    + " | " + a.getAge() + " | " + a.getLoginDate());
    }
    session1.close();
    }
    }
    表语句CREATE TABLE `mybatis3_author` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `NAME` varchar(255) DEFAULT NULL,
      `LOGINDATE` datetime DEFAULT NULL,
      `age` smallint(3) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;