【问题标题】:JOIN two tables JPQLJOIN 两个表 JPQL
【发布时间】:2017-11-20 00:05:03
【问题描述】:
@Entity
@Table(name="tblUser")    
public class User {

@Id
@GeneratedValue
@Column(name="id")
private Long id;

@Column(name="email",nullable=false)
private String email;

@Column(name="password",nullable=false)
private String password;

@Column(name="first_name")
private String firstName;

@Column(name="last_name")
private String lastName;

@OneToMany(mappedBy="user")
private List<Address> addresses = new ArrayList<>();
}



@Entity
@Table(name="tblAddress")
public class Address {

@Id
@GeneratedValue
@Column
private Long id;

@Column
private String streat;

@Column
private String number;

@ManyToOne(fetch=FetchType.EAGER)
private User user;
}



public interface UserService {
List<User> findAll(); 
}



@Service
public class JpaUserService implements UserService {
@Autowired
private UserRepository userRepository;

@Override
public List<User> findAll() {
    return userRepository.findAll();
    }
}



@Controller
@RequestMapping(value="/api/users")
public class ApiUserController {

@Autowired
private UserService userService;

@Autowired
private UserDTOToUser toUser;

@Autowired
private UserToUserDTO toDto;

@RequestMapping(method=RequestMethod.GET)
ResponseEntity<List<UserDTO>> getUser()

List<User> users = userService.findAll();

if(users == null || users.isEmpty()){
    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}

return new ResponseEntity<>(toDto.convert(users), HttpStatus.OK);
    }
}



@Repository
public interface UserRepository extends JpaRepository<User, Long> {

@Query("select u.id, a.number FROM User u LEFT JOIN u.addresses a WHERE u.id = a.user")
List<User> findAll();
}

当我尝试在本地主机上的RestClient 中运行我的代码时,我得到了这个异常:

{
"timestamp": 1511105123172,
"status": 500,
"error": "Internal Server Error",
"exception": "java.lang.ClassCastException",
"message": "[Ljava.lang.Object; cannot be cast to jwd.wafepa.model.User",
"path": "/api/users"
}

顺便提一下,UserDTO 是没有密码参数的User 类。

如何在 JPQL 中编写正确的 JOIN 查询?

【问题讨论】:

    标签: java spring hibernate jpql


    【解决方案1】:

    @Query 只能返回List&lt;Object&gt;,如果仅从表中选择特定字段。建议您将@Query 更改为SELECT u FROM User u LEFT JOIN u.addresses a WHERE u.id = a.user

    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
        @Query("SELECT u FROM User u LEFT JOIN u.addresses a WHERE u.id = a.user")
        List<User> findAll();
    }
    

    【讨论】:

    • 我明白了。还有其他方法可以在 RestClient 中列出该字段吗?或者我们可以得到整个对象?
    • 可以只获取特定字段,但返回对象是List&lt;Object&gt;。您需要更改toDto 中的convert() 方法。
    猜你喜欢
    • 2014-12-17
    • 1970-01-01
    • 2013-11-13
    • 2016-10-07
    • 2013-01-11
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多