我有Post和Tag具有@manytomany 关系的模型。
邮政
@Entity
public class Post {
private long id;
@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinTable(joinColumns = @JoinColumn(name = "post_id"), inverseJoinColumns = @JoinColumn(name = "tag_id"))
private Set<Tag> tags;
...
}
Run Code Online (Sandbox Code Playgroud)
标签
@Entity
public class Tag {
private String name;
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "tags")
private List<Post> posts = new ArrayList<Post>();
Run Code Online (Sandbox Code Playgroud)
我想创建一个方法,通过标签名称查找所有分页的帖子。
我发现 JPQL 不支持LIMIT.
我是否必须使用 实现我自己的分页逻辑setFirstResult().setMaxResults().getResultList()?
@manytomany 分页的最佳做法是什么?
我稍微编辑了我的问题。我写了我的代码,如下所示:
@SuppressWarnings("unchecked") …Run Code Online (Sandbox Code Playgroud) 我想在 UserService(具体类)的 save() 方法中使用 @Transactional 注释,如下所示:
@Service
public class UserService {
@Transactional
public Long save(User userCommand, BindingResult result) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我将通过自动装配在 MyRealm 中使用此服务。
public class MyRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
}
Run Code Online (Sandbox Code Playgroud)
但是,它失败并出现以下错误:
java.lang.IllegalArgumentException: Can not set n.r.c.s.user.UserService field n.r.c.s.realm.MyRealm.userService to com.sun.proxy.$Proxy48
Run Code Online (Sandbox Code Playgroud)
当然,如果我删除 @Transational 注释,它会起作用。
我的事务管理器设置如下:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
Run Code Online (Sandbox Code Playgroud)
请让我知道我的代码有什么问题?
我需要设置代理之类的东西吗?
我想将“注释计数”字段添加到 Django Admin 中的 list_display 中。
模型.py
class Log(models.Model):
...
ip_address = models.GenericIPAddressField(
verbose_name=_('IP address'),
db_index=True,
)
...
Run Code Online (Sandbox Code Playgroud)
管理员.py
class LogAdmin(admin.ModelAdmin):
list_display = (..., 'ip_address', 'ip_address_count', ...)
def ip_address_count(self, instance):
return models.Log.objects \
.filter(ip_address=instance.ip_address) \
.count()
ip_address_count.short_description = _('IP Address Count')
Run Code Online (Sandbox Code Playgroud)
它可以很好地处理“大量”SQL 查询。
admin.py我想像这样改进我的:
class Log(models.Model):
...
def get_queryset(self, request):
qs = super(LogAdmin, self).get_queryset(request)
qs = qs.values('ip_address') \
.annotate(ip_address_count=Count('ip_address'))
return qs
def ip_address_count(self, instance):
return instance.ip_address_count
Run Code Online (Sandbox Code Playgroud)
但是,我遇到了错误消息:
'dict' object has no attribute '_meta'
看来我找到了错误发生的原因:
Django 管理员,无法分组依据:异常值:“dict”对象没有属性“_meta”
然而,这并不能帮助我解决问题。
谢谢您的回答。
编辑:如果我不附加 …