我试着用普通的方法写但不能执行
确定应该为联合主键识别问题
请问要更新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)
确定应该为联合主键识别问题
请问要更新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)
解决方案 »
- 我用的ssh,并且使用了OpenSessionInView,但是还是could not initialize proxy - no Session
- 14个经典的Javascript代码
- Struts2+JFreeChart生成热点图的问题
- Hibernate 3.0 与 struts2.0 结合时的错误
- 数据量超大的表高效管理的讨论-大量实时采集的数据在数据库中的问题的讨论
- 服务器项目中Hibernate这样配置正确么,为什么我的jsp项目过段时间就出错呢
- 请问有没有用PIII的电脑做J2EE开发的?(非技术贴请斑竹手下留情)
- jsp能做到象.NET的DataGrid那样修改的时候出现Textbox框,保存后变回原样么?
- 大家来拿高分!!!!!!!!!!
- 连接池--JNDI 的问题? 在线求助!
- <package name="user" namespace="/user" extends="struts-default">
- cygwin 运行 bin/nutch crawl urls -dir crawled -depth 3 -topN 50 >&crawl.log 出现下面问题
你的s1是什么,这样写肯定找不到属性的吧?,你的spk 与name 都应该是Student 这个POJO类的属性才成
你这语句好混乱。 spk2是个变量,应该不能出现在双引号中当个字符串吧! uupdate Student s 定义表的别名是s 怎么后面出现 s1.nam='bbbbb'呢?s1是啥玩意?
另我就是不知道改动联合主键的设置方法
s.spk=spk2这段该怎么改请教
我现在的问题是怎么用HQL达成只有更动的数据才帮我写到数据库
举例:s的name属性改了就只更动这个s对象在数据库里的name字段不会更新其他属性
同时你给的例子修改了主键,这个貌似使用hibernate是不可以的,如果你需要修改主键你需要使用SQL。
然后 update(查出的对象)
或者 直接用session.createSQLQuery(sql).executeUpdate();执行SQL语句修改
不可以这么做的吧
经过实际测试,可以修改复合主键。下面给出一个例子:仅供参考@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;