2015-04-22 26 views
0

我正在開發一個使用JDO彈簧的系統。我想用mysql加入來獲取數據。 我的表是:在JDO彈簧中加入兩個表格

USER_LOGIN:USER_ID,USER_NAME,USER_PASSWORD,user_role_id

USER_ROLE:ID,角色

我需要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非常新。 請幫忙!!

回答

0

@ManyToOne和@OneToMany是JPA註釋,但是您使用JDO註釋,因此將其刪除。

該列來自關係FK列「userRole」。如果不需要該名稱,請指定列名稱。這全部記錄在任何像樣的JDO文檔中,例如DataNucleus的那些文檔

它做了LEFT OUTER JOIN,因爲它可以爲null;如果你不想在那裏允許空值,那麼設置註釋/ XML來做到這一點