我正在寻找一种有效的方法来保留一组星期几。换句话说,用户将从工作日列表中选择任意天数。具体日期无关紧要,重要的是星期几。我需要将这组日期存储在 hibernate 实体中。
我可以存储其中之一:
Set<DayOfWeek>
Set<Integer>
但我认为它可能比这更简单。如果我只使用一个 int 来存储数据并使用按位运算怎么办?例如:
Sun = 1
Mon = 2
Tue = 4
Wed = 8
Thu = 16
Fri = 32
Sat = 64
因此,为了表示 Sun、Mon、Wed、Sat 的集合,我会保留整数 75。这是因为 1+2+8+64 = 75。
我关心的是在这样的字段上执行查询。我能否找到 Wed 选择的所有实体?
这看起来是个好方法吗?有人有更好的主意吗?
谢谢!
最佳答案
您可以使用 Enum 来设置星期几
public enum DAYS_OF_THE_WEEK {
SUN,
MON,
TUE,
WED,
THU,
FRI,
SAT;
}
现在您可以使用值类型的集合,因为 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;
}
不要忘记复合元素或值类型实例的生命周期受所属实体实例生命周期的限制。
如前所述:
Would I be able to find all entities that have Wed selected ?
是
select distinc OwningEntity _owningEntity inner join fetch _owningEntity.selectedDays selectedDay where selectedDay = :selectedDay
query.setParameter("selectedDay", DAYS_OF_THE_WEEK.WED);
query.list();
添加到原始答案:我如何实现 FetchingStrategy
假设有以下模型
@Entity
public class Customer {
private List<Order> orderList = new ArrayList<Order>();
// getter's and setter's
}
现在我们的接口(interface) CustomerRepository
public interface CustomerRepository {
Customer getById(Integer id, CustomerFetchingStrategy fetchingStrategy);
List<Customer> getAll(CustomerFetchingStrategy fetchingStrategy);
public static enum CustomerFetchingStrategy {
PROXY,
CUSTOMER,
CUSTOMER_WITH_ORDERS;
}
}
我们的实现
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
}
}
因此,是否某些用例仅需要客户,我称
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);
}
}
希望对你有用
问候,
关于java - 保留一组星期几,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233943/