2016-04-01 9 views
1

コンテンツフォームの外部キー(restaurant_idとchannel_id)を取得するにはどうすればよいですか?私はFKの値ではなく、restaurant_idのレストラン名とchannel_idのチャンネル名を意味します。外部キーでデータを取得するには?

Tabeles:

enter image description here

モデル:

@Entity 
@Table(name = "restaurant") 
public class Restaurant { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "restaurant_id") 
    private List<Booking> bookings; 

    ... 

@Entity 
@Table(name = "channel") 
public class Channel { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinColumn(name = "channel_id") 
    private List<Booking> bookings; 

    ... 

@Entity 
@Table(name = "booking") 
public class Booking { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name = "restaurant_id", unique = true) 
    private Long restaurant_id; 

    @Column(name = "channel_id", unique = true) 
    private Long channel_id; 

    ... 

    @Override 
    public String toString() { 
     return "Booking [id=" + id + ", name=" + name + ", count=" + count + ", duration=" + duration + ", start=" 
       + start + ", phone=" + phone + ", comment=" + comment + ", updated=" + updated + ", created=" + created 
       + ", active=" + active + ", restaurant_id=" + restaurant_id + ", channel_id=" + channel_id + "]"; 
    } 

    ... 

DAO

@Repository 
public class BookingDaoImpl implements BookingDao { 

    private static final Logger logger = LoggerFactory.getLogger(BookingDaoImpl.class); 

    @Resource(name = "localSessionFactoryBean") 
    private SessionFactory sessionFactory; 

    @Override 
    public List<Booking> getBookings() { 
     Session session = this.sessionFactory.getCurrentSession(); 
     List<Booking> bookingList = session.createCriteria(Booking.class).list(); 
     for (Booking booking : bookingList) { 
      logger.info("Booking List::" + booking); 
     } 
     return bookingList; 
    } 

    ... 

サービス

@Service 
public class BookingServiceImpl implements BookingService { 

    @Autowired 
    private BookingDao bookingDao; 

    @Override 
    @Transactional 
    public List<Booking> getBookings() { 
     return bookingDao.getBookings(); 
    } 

    ... 

コントローラ

@Controller 
public class MainController { 

    @Autowired 
    private BookingService bookingService; 

    @RequestMapping(value = "bookings", method = RequestMethod.GET) 
    public String bookings(Model model) { 
     List<Booking> bookingList = bookingService.getBookings(); 
     model.addAttribute("bookings", bookingList); 
     return "bookings"; 
    } 

    ... 

JSP

<c:forEach items="${bookings}" var="booking"> 
    <tr> 
     <td>${booking}</td> 
    </tr> 
</c:forEach> 

のtoString()結果:

enter image description here

+0

正確に情報を入手したいとお考えですか? JSP?コントローラかSQLクエリで? – dubes

+0

JSP。今私はrestaurant_id = 1、channel_id = 1を取得しますが、私はレストランの名前、またはアドレスとチャネル名を取得したいと思います。私は多くのことをすることができません。 – BrainDead

答えて

0
@Entity 
@Table(name = "restaurant") 
public class Restaurant { 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="restaurant") 
    private List<Booking> bookings; 

} 

@Entity 
@Table(name = "channel") 
public class Channel { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="channel") 
    private List<Booking> bookings; 

} 

@Entity 
@Table(name = "booking") 
public class Booking { 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "restaurant_id") 
    private Restaurant restaurant; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "channel_id") 
    private Channel channel; 

} 

あなたはsession.createQuery()でHQLを使用することができます。

これは、すべてBookingを熱心にフェッチすることになります。フェッチでもCriteriaを使用できます。

from Booking b left join fetch b.restaurant left join fetch b.channel 

名前を取得すると、List<Object[]>として処理することも、DTOにトランスを使用することもできます。

select booking.name, restaurant.name, channel.name 
    from Booking booking left join booking.restaurant restaurant left join booking.channel channel 
+0

このHQLはどのように実装する必要がありますか? – BrainDead

+0

@ user3374117私の回答を更新します –

+0

働き、ありがとう! – BrainDead

関連する問題