坚持一周的一天

Tau*_*ren 3 java hibernate bit-manipulation

我正在寻找一种有效的方法来坚持一周的日子.换句话说,用户将从工作日列表中选择任意天数.具体日期无关紧要,只是一周中的某一天.我需要将这一天存储在一个休眠实体中.

我可以存储其中一个:

Set<DayOfWeek>
Set<Integer>
Run Code Online (Sandbox Code Playgroud)

但我认为它可能比这更简单.如果我只使用单个int来存储数据并使用按位运算,该怎么办?例如:

Sun = 1
Mon = 2
Tue = 4
Wed = 8
Thu = 16
Fri = 32
Sat = 64
Run Code Online (Sandbox Code Playgroud)

因此,为了表示太阳,周一,周三,周六的集合,我将保持整数75.这是因为1 + 2 + 8 + 64 = 75.

我担心的是对这样的字段执行查询.我能找到所有选择了Wed的实体吗?

这看起来像是一个好方法吗?有没有人有更好的主意?

谢谢!

Art*_*ald 5

您可以使用Enum来设置一周中的几天

public enum DAYS_OF_THE_WEEK {
    SUN,
    MON,
    TUE,
    WED,
    THU,
    FRI,
    SAT;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用值类型的集合,因为Hibernate支持它.

@CollectionOfElements
@Enumerated(EnumType.STRING)
@JoinTable(
    name="SELECTED_DAYS_OF_THE_WEEK",
    joinColumns=@JoinColumn(name="<OWNING_ENTITY_ID_GOES_HERE>")
)
public Set<DAYS_OF_THE_WEEK> getSelectedDays() {
    return this.selectedDays;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记复合元素的生命周期或值类型实例受拥有实体实例的生命周期限制.

如上所述:

我能找到所有选择了Wed的实体吗?

select distinc OwningEntity _owningEntity inner join fetch _owningEntity.selectedDays selectedDay where selectedDay = :selectedDay

query.setParameter("selectedDay", DAYS_OF_THE_WEEK.WED);

query.list();
Run Code Online (Sandbox Code Playgroud)

添加到原始答案:我如何实现FetchingStrategy

假设以下模型

@Entity
public class Customer {

    private List<Order> orderList = new ArrayList<Order>();

    // getter's and setter's

}
Run Code Online (Sandbox Code Playgroud)

现在我们的接口CustomerRepository

public interface CustomerRepository {

    Customer getById(Integer id, CustomerFetchingStrategy fetchingStrategy);
    List<Customer> getAll(CustomerFetchingStrategy fetchingStrategy);

    public static enum CustomerFetchingStrategy {
        PROXY,
        CUSTOMER,
        CUSTOMER_WITH_ORDERS;         
    }

}
Run Code Online (Sandbox Code Playgroud)

我们的实施

import static br.com.app.CustomerRepository.CustomerFetchingStrategy;

public class CustomerRepositoryImpl implements CustomerRepository {

    // Usually Spring IoC or Seam @In-jection or something else
    private SessionFactory sessionFactory;

    public Customer getById(Integer id, CustomerFetchingStrategy fetchingStrategy) {
        switch(fetchingStrategy) {
            case PROXY:
                return (Customer) sessionFactory.getCurrentSession().load(Customer.class, id);
            case CUSTOMER:
                return (Customer) sessionFactory.getCurrentSession().get(Customer.class, id);
            case CUSTOMER_WITH_ORDERS:
                return (Customer) sessionFactory.getCurrentSession().createQuery("from Customer c left join fetch c.orderList where c.id = :id")
                                  .setParameter("id", id)
                                  .list().get(0);
        }
    }

    public List<Customer> getAll(CustomerFetchingStrategy fetchingStrategy) {
        // Same strategy as shown above
    }

} 
Run Code Online (Sandbox Code Playgroud)

因此,无论一些Use Case是否需要CUSTOMER,我打电话

import static br.com.app.CustomerRepository.CustomerFetchingStrategy;

public class SomeController {

    // Again Spring Ioc or Seam @In-jection
    private CustomerRepository customerRepository;

    public void proccessForm(HttpServletRequest request, HttpServletResponse response) {
        request.setParameter("customer", customerRepository.getById(Integer.valueOf(request.getParameter("customerId"))), CUSTOMER);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望它对你有用

问候,