在JDO spring中加入两个表

时间:2015-04-22 08:35:53

标签: spring join annotations jdo

我正在使用JDO spring开发一个系统。我想使用mysql加入获取数据。 我的表是:

User_Login:user_id,user_name,user_password,user_role_id

User_Role:id,role

我需要的sql是:

SELECT `A0`.`USER_ID`,`B0`.`ROLE` FROM `USER_LOGIN` `A0` INNER JOIN 
`USER_ROLE` `B0` ON `A0`.`USER_ROLE_ID` = `B0`.`ID` WHERE 
`A0`.`USER_NAME` = ? AND `A0`.`USER_PASSWORD` = ?

我想使用注释而不是使用XML来做到这一点。 我的POJO课程是。

User.Java

@PersistenceCapable(table="User_Login")
public class User {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Column(name="user_id")
private Integer userId=0;
@Persistent
@Column(name="user_profile_name")
private String userProfileName=null;  
@Persistent
@Column(name="user_email")
private String userEmail=null;
@Persistent
@Column(name="user_contact")
private String userContact=null;
@Persistent
@Column(name="user_name")
private String userName=null;
@Persistent
@Column(name="user_password")
private String userPassword=null;
@Persistent      
@Column(name="user_role_id")
private Integer userRoleId=0;       
@Persistent
@ManyToOne(fetch = FetchType.EAGER)
private Role userRole;

Role.java

@PersistenceCapable(table="User_Role")
public class Role {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@OneToMany(mappedBy = "user_role_id", fetch= FetchType.EAGER)
@Column(name="id")
private Integer roleId=0;
@Persistent
@Column(name="role")
private String role=null;

UserDaoImpl.java:

@Override
@Transactional
public List<User> getUser(String user_name, String user_password) {
    PersistenceManager pm = this.persistenceManagerFactory.getPersistenceManager();
    Transaction tx = pm.currentTransaction();
    Query query = pm.newQuery(User.class);
    query.setFilter("this.userName == userNameParam && this.userPassword==userPasswordParam");
    query.declareParameters("String userNameParam, String userPasswordParam");
    query.setResult("this.userId,this.userRole.role");
  try {
    // Start the transaction
    tx.begin();
    List<User> result = (List<User>)query.execute(user_name,user_password);            
    if(result.size()>0){
        log.info(">>>>>00000000");
    }else{
        log.info("<<<<<<<=====000000");
    }
    // Commit the transaction, flushing the object to the datastore
    tx.commit();
    return result;
    }
    finally {
        if (tx.isActive())
        {
            // Error occurred so rollback the transaction
            tx.rollback();
        }
        pm.close();
    } 

我收到错误:

 javax.jdo.JDOException: Exception thrown when executing query : SELECT 
 `A0`.`USER_ID`,`B0`.`ROLE` FROM `USER_LOGIN` `A0` LEFT OUTER JOIN 
 `USER_ROLE` `B0` ON `A0`.`USERROLE_ID_OID` = `B0`.`ID` WHERE 
 `A0`.`USER_NAME` = ? AND `A0`.`USER_PASSWORD` = ?
  NestedThrowables:
  com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown   
  column 'A0.USERROLE_ID_OID' in 'on clause'

我不知道USERROLE_ID_OID来自何处。我是JDo的新手。 请帮助!!

1 个答案:

答案 0 :(得分:0)

@ManyToOne和@OneToMany是JPA注释,但您使用JDO注释以删除它们。

该列来自关系FK列“userRole”。如果您不想要该名称,请指定列名称。这些都记录在任何体面的JDO文档中,例如DataNucleus的文档

LEFT OUTER JOIN因为它可以为null;如果你不想在那里允许空值,那么设置注释/ XML来做那个