【问题标题】:join two tables in JDO spring在 JDO spring 中加入两个表
【发布时间】:2015-04-22 08:35:52
【问题描述】:

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

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 课程是。

用户.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;

角色.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 的新手。 请帮忙!!

【问题讨论】:

    标签: spring join annotations jdo


    【解决方案1】:

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

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

    它确实是 LEFT OUTER JOIN 因为它可以为空;如果你不想在那里允许空值,那么设置注释/XML 来做到这一点

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多